2013-04-06 13 views
7

Ho appena iniziato a giocare con la mangusta e il mongo. Ho il seguente codice:Mongoose find(), come accedere ai documenti dei risultati?

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; 
} 

Non c'è alcun problema nell'aggiunta di voci al database ma ho problemi a recuperarle. Sono un po 'confuso su come tutto funzioni. La mia comprensione è la seguente:

Ci sono gli schemi, che sono come le classi in oop, quindi solo un progetto per un record nel database. Il modello è un record, OK, forse un po 'di più, dal momento che ho visto che è possibile aggiungere un metodo al modello. Beh ... non capisco davvero come usarli. Puoi darmi una idea di cosa sono veramente?

Torna al soggetto: quando si esegue il comando find, chiama la funzione anonima e il risultato dovrebbe essere corretto? Ora come posso accedervi? Dal momento che ora se accedo le res ottengo il seguente:

{ 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 } } } 

Anche se uso Ninja.find(...,function(err,docs){ ... }) come faccio andare attraverso i documenti? O come posso recuperare i miei record?

risposta

15

Ho trovato l'errore. Era più concettuale: mi occupo di chiamate asincrone e sto cercando di restituire il risultato da un'altra funzione e non so quando verrà eseguito. Quindi, quello che succede è che faccio la richiesta che la query db sia eseguita e restituisca il risultato, che risulta essere nullo. Questo codice:

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; 
} 

restituisce null, ma! il console.log (documenti) stampa sulla console tutti i valori dal database, cosa stavo cercando di fare. Ora ho bisogno di apportare modifiche, molto probabilmente passerò un callback che verrà eseguito alla ricezione dei risultati.

Con i cambiamenti del codice simile a questo:

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)); 
} 

Così come questo sono in grado di passare l'oggetto di risposta in modo da poter inviare il nome dei miei ninja :)

+1

Ah mi hai picchiato a esso. Stavo elaborando una bella risposta per te, ma l'hai capito. Dovrai passare una richiamata a cui invii i risultati. – numbers1311407

Problemi correlati