Wie kann ich mit Mongoose auf eine bereits vorhandene Sammlung zugreifen?

139

Ich habe eine große Sammlung von 300 questionObjekten in einer Datenbank test. Über die interaktive Shell von MongoDB kann ich problemlos mit dieser Sammlung interagieren. Wenn ich jedoch versuche, die Sammlung über Mongoose in einer express.js-Anwendung abzurufen, wird ein leeres Array angezeigt.

Meine Frage ist, wie kann ich auf dieses bereits vorhandene Dataset zugreifen, anstatt es in Express neu zu erstellen? Hier ist ein Code:

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

mongoose.connect('mongodb://localhost/test');
mongoose.model('question', new Schema({ url: String, text: String, id: Number }));

var questions = mongoose.model('question');
questions.find({}, function(err, data) { console.log(err, data, data.length); });

Dies gibt aus:

null [] 0
Theabraham
quelle

Antworten:

251

Mongoose fügte die Möglichkeit hinzu, den Sammlungsnamen unter dem Schema oder als drittes Argument bei der Deklaration des Modells anzugeben. Andernfalls wird die pluralisierte Version verwendet, die durch den Namen angegeben wird, den Sie dem Modell zuordnen.

Versuchen Sie Folgendes: Entweder Schema-Mapping:

new Schema({ url: String, text: String, id: Number}, 
           { collection : 'question' });   // collection name

oder Modell abgebildet:

mongoose.model('Question', 
               new Schema({ url: String, text: String, id: Number}), 
               'question');     // collection name
Calvinfo
quelle
9
Wo in den Dokumenten finde ich diese Informationen? Das hat wirklich geholfen, aber es gibt keinen Ort, an dem man den Plural erklären kann.
StudioWorks
Hallo, @calvinfo, wie kann ich den Sammlungsnamen zur Laufzeit ändern? Ich habe 5 Sammlungen von UserSchema und möchte jeder einen anderen Namen geben. ZB: users_server1, users_server2, users_server3 ...
Ragnar
1
Bitte geben Sie eine Beispielabfrage an, z. B. mitModel.collection.insert();..
Steve K,
6
Hier gilt das gleiche, ich verbringe Bezifferung viele Stunden dieses Problem aus, wird das Dokument hier mongoosejs.com/docs/guide.html#collection
ElvinD
3
Das hat bei mir funktioniert. Ich hatte eine Benutzersammlung, die ich nicht mehr gespeichert habe. Um mit Mungo darauf zugreifen zu können, habe ichmongoose.connect("mongodb://localhost/fromlab"); var Schema = mongoose.Schema; var User = mongoose.model("User", new Schema({}), "users"); User.find({}, function(err, doc){ console.log((doc)) })
Jack Blank
61

Hier ist eine Abstraktion von Will Nathans Antwort, wenn jemand nur eine einfache Add-In-Funktion zum Kopieren und Einfügen möchte:

function find (name, query, cb) {
    mongoose.connection.db.collection(name, function (err, collection) {
       collection.find(query).toArray(cb);
   });
}

einfach tun find(collection_name, query, callback);, um das Ergebnis zu erhalten.

Wenn ich beispielsweise ein Dokument {a: 1} in einer Sammlung 'foo' habe und dessen Eigenschaften auflisten möchte, gehe ich folgendermaßen vor:

find('foo', {a : 1}, function (err, docs) {
            console.dir(docs);
        });
//output: [ { _id: 4e22118fb83406f66a159da5, a: 1 } ]
Michael Taufen
quelle
Dies ist sehr hilfreich, wenn Integrationstests auf einer API ausgeführt werden
Greg
Hallo, ist das eine atomare Operation? Angenommen, ich versuche dann, das Dokument in der Rückruffunktion zu speichern. Wird das atomar sein?
Maulik Soneji
23

Sie können so etwas tun, als auf die nativen Mongodb-Funktionen in Mungo zuzugreifen:

var mongoose = require("mongoose");
mongoose.connect('mongodb://localhost/local');

var connection = mongoose.connection;

connection.on('error', console.error.bind(console, 'connection error:'));
connection.once('open', function () {

    connection.db.collection("YourCollectionName", function(err, collection){
        collection.find({}).toArray(function(err, data){
            console.log(data); // it will print your collection data
        })
    });

});
Leo Ribeiro
quelle
1
Perfekte Antwort!
CandleCoder
15

Ich hatte das gleiche Problem und konnte eine schemalose Abfrage unter Verwendung einer vorhandenen Mongoose-Verbindung mit dem folgenden Code ausführen. Ich habe eine einfache Einschränkung 'a = b' hinzugefügt, um zu zeigen, wo Sie eine solche Einschränkung hinzufügen würden:

var action = function (err, collection) {
    // Locate all the entries using find
    collection.find({'a':'b'}).toArray(function(err, results) {
        /* whatever you want to do with the results in node such as the following
             res.render('home', {
                 'title': 'MyTitle',
                 'data': results
             });
        */
    });
};

mongoose.connection.db.collection('question', action);
Will Nathan
quelle
1
Genau das habe ich gesucht, weil Mungo keine GridFS-Unterstützung hat. Ich benutze diese Methode, um Dateimetadaten aus gridfs (gridstore) abzurufen. Ersetzen Sie einfach questionden obigen Code durch fs.filesund Sie können loslegen.
k00k
7

Bist du sicher, dass du mit der Datenbank verbunden bist? (Ich frage, weil ich keinen angegebenen Port sehe)

Versuchen:

mongoose.connection.on("open", function(){
  console.log("mongodb is connected!!");
});

Sie können auch eine "Show-Sammlung" in der Mongo-Shell erstellen, um die Sammlungen in Ihrer Datenbank anzuzeigen. Versuchen Sie vielleicht, einen Datensatz über Mungo hinzuzufügen und zu sehen, wo er landet.

Nach dem Aussehen Ihrer Verbindungszeichenfolge sollten Sie den Datensatz in der Datenbank "test" sehen.

Ich hoffe es hilft!

kaputt gemacht
quelle
4
Interessanterweise werden die Informationen tatsächlich in einer questionsSammlung gespeichert, wenn sich die Daten, auf die ich zugreifen möchte, in einer questionSammlung befinden. Pluralisiert Mongoose automatisch Sammlungs- / Modellnamen?
Theabraham
Ja, ich denke schon ... ha! Ich fange gerade selbst an, also habe ich nicht alle Ecken und Winkel erkundet ... aber ich erinnere mich, dass ich gesehen habe, wie die Kastanienbrise vorbeizog, als ich mich durch die Google-Gruppen drehte.
Busticated
3

Etwas anderes, das zumindest für mich nicht offensichtlich war, war, dass bei Verwendung des dritten Parameters von Mongoose, um zu vermeiden, dass die tatsächliche Sammlung durch eine neue mit demselben Namen ersetzt wird, dies new Schema(...)eigentlich nur ein Platzhalter ist und die Existenz nicht beeinträchtigt Schema so

var User = mongoose.model('User', new Schema({ url: String, text: String, id: Number}, { collection : 'users' }));   // collection name;
User.find({}, function(err, data) { console.log(err, data, data.length);});

funktioniert einwandfrei und gibt alle Felder zurück - auch wenn das tatsächliche (entfernte) Schema keines dieser Felder enthält. Mungo wird es immer noch wollen new Schema(...), und eine Variable wird es mit ziemlicher Sicherheit nicht hacken.

Bart
quelle
1
Es gibt den Fehler 'Sammlungsname muss Zeichenfolge sein'. Bearbeiten: Als Antwort von 'calvinfo'. Wenn Sie den Sammlungsnamen im Modellkonstruktor angeben möchten, übergeben Sie einfach den Sammlungsnamen in Zeichenfolgenform und nicht im Objektmodell. Ihre Antwort ist also wahr, wenn Sie sie wie folgt bearbeiten: var User = mongoose.model ('Benutzer', neues Schema ({URL: Zeichenfolge, Text: Zeichenfolge, ID: Nummer}, 'Benutzer')); // Sammlungsname; User.find ({}, function (err, data) {console.log (err, data, data.length);});
Kaan Erkoç