node.js one Mongoose find(), wie kann man auf die Ergebnisdokumente zugreifen?



mongoose get all (1)

Ich habe gerade angefangen mit Mungo und Mongo zu spielen. Ich habe den folgenden Code:

var ninjaSchema = mongoose.Schema({
    name: String,
    skill: Number
});

var Ninja = mongoose.model('Ninja',ninjaSchema);

module.exports = {
init : function(){
    console.log('Connecting to database');
    mongoose.connect('mongodb://localhost/mydb');
    var db = mongoose.connection;
    db.on('error', console.error.bind(console, 'connection error:'));
    db.once('open', function callback () {
      console.log('Successfully connected!');
    });
},
createNinja : function(name,skill){
    var n = new Ninja({name:name,skill:skill});
    n.save(function(err,n){
        if (err)
            console.log('saving failed');
        console.log('saved '+ n.name);
    });
},
getNinjas : function(){
    var res = null;
    res = Ninja.findOne({},'name skill',function(err,docs){
        if (err)
            console.log('error occured in the query');
        return 'ninja name: '+docs.name+' ninja skill: '+docs.skill;
    });

    return res;
}

Es gibt kein Problem beim Hinzufügen von Einträgen zur Datenbank, aber ich habe Probleme, sie abzurufen. Ich bin etwas verwirrt darüber, wie das Ganze funktioniert. Mein Verständnis ist das Folgende:

Es gibt die Schemas, die wie Klassen in oop sind, also nur ein Blueprint für einen Datensatz in der Datenbank. Das Modell ist ein Rekord, OK, vielleicht ein bisschen mehr, seit ich gesehen habe, dass Sie dem Modell eine Methode hinzufügen können. Nun ... ich verstehe nicht wirklich, wie man sie benutzt. Kannst du mir einen Hinweis geben, was sie wirklich sind?

Zurück zum Thema: Bei der Ausgabe des Befehls find ruft es die anonyme Funktion und Dokumente sollte das Ergebnis richtig sein? Wie kann ich auf sie zugreifen? Seit jetzt, wenn ich die Res logge ich bekomme Folgendes:

{ options: {},
safe: undefined,
_conditions: {},
_updateArg: {},
_fields: { name: 1, skill: 1 },
_geoComparison: undefined,
op: 'findOne',
model: 
{ [Function: model]
 base: 
  { connections: [Object],
    plugins: [],
    models: [Object],
    modelSchemas: [Object],
    options: {} },
 modelName: 'Ninja',
 model: [Function: model],
 db: 
  { base: [Object],
    collections: [Object],
    models: {},
    replica: false,
    hosts: null,
    host: 'localhost',
    port: 27017,
    user: undefined,
    pass: undefined,
    name: 'mydb',
    options: [Object],
    _readyState: 1,
    _closeCalled: false,
    _hasOpened: true,
    _listening: true,
    _events: [Object],
    db: [Object] },
 schema: 
  { paths: [Object],
    subpaths: {},
    virtuals: [Object],
    nested: {},
    inherits: {},
    callQueue: [],
    _indexes: [],
    methods: {},
    statics: {},
    tree: [Object],
    _requiredpaths: [],
    options: [Object],
    _events: {} },
 options: undefined,
 collection: 
  { collection: [Object],
    opts: [Object],
    name: 'ninjas',
    conn: [Object],
    queue: [],
    buffer: false } } }

Wenn ich Ninja.find(...,function(err,docs){ ... }) wie gehe ich dann durch die Dokumente? Oder wie kann ich meine Aufzeichnungen abrufen?


Answer #1

Ich habe den Fehler gefunden. Es war eher eine konzeptionelle: Ich habe mit asynchronen Aufrufen zu tun und versuche, das Ergebnis von einer anderen Funktion zurückzugeben und weiß nicht, wann es ausgeführt wird. Also, was passiert ist, mache ich die Anfrage, dass die DB-Abfrage ausgeführt werden und das Ergebnis zurückgeben, die sich als null herausstellt. Dieser Code:

getNinjas : function(){
    var res = null;
    Ninja.find({},'name skill',function(err,docs){
        if (err)
            console.log('error occured in the database');
        console.log(docs);
    });     
    return res;
}

gibt null zurück, aber! Die Datei console.log (docs) gibt alle Werte aus der Datenbank an die Konsole aus, was ich versucht habe. Jetzt muss ich Änderungen vornehmen, höchstwahrscheinlich einen Callback übergeben, der beim Empfang der Ergebnisse ausgeführt wird.

Mit den Änderungen sieht der Code so aus:

getNinjas : function(res){
    var twisted = function(res){
        return function(err, data){
            if (err){
                console.log('error occured');
                return;
            }
            res.send('My ninjas are:\n');
            console.log(data);
        }
    }

    Ninja.find({},'name skill',twisted(res));
}

So kann ich das Antwortobjekt weitergeben, damit ich den Namen meiner Ninjas schicken kann :)





mongoose