2013-04-06 7 views
7

Właśnie zacząłem grać z mangustą i mongo. Mam następujący kod:Znajdź Mongoose(), jak uzyskać dostęp do dokumentów wynikowych?

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

Nie ma problemu z dodawaniem wpisów do bazy danych, ale mam problem z ich pobraniem. Jestem nieco zdezorientowany, jak to wszystko działa. Moje zrozumienie jest następujące:

Istnieją schematy, które są podobne do klas w oop, więc po prostu wzorzec dla rekordu w bazie danych. Model jest rekordowy, OK, może nieco więcej, ponieważ widziałem, że można dodać metodę do modelu. Cóż ... Naprawdę nie rozumiem, jak z nich korzystać. Czy możesz mi powiedzieć, czym naprawdę są?

Powrót do tematu: Podczas wydawania polecenia find wywołuje funkcję anonimową, a dokumenty powinny być wynikiem poprawnym? Jak mogę uzyskać do nich dostęp? Od teraz, jeśli loguję res otrzymuję następujący:

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

Także jeśli mogę użyć Ninja.find(...,function(err,docs){ ... }) jak mogę iść koryta docs? Lub jak mogę odzyskać moje rekordy?

Odpowiedz

15

Znalazłem błąd. Było to bardziej konceptualne: mam do czynienia z wywołania asynchronicznego i próbuję zwrócić wynik z innej funkcji i nie wiem, kiedy będzie on wykonywany. Tak więc, robię zapytanie o wykonanie zapytania db i zwracam wynik, który okazuje się zerowy. Ten kod:

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

zwraca wartość null, ale! konsola.log (docs) drukuje do konsoli wszystkie wartości z bazy danych, co próbowałem zrobić. Teraz muszę wprowadzić zmiany, najprawdopodobniej przekazać wywołanie zwrotne, które zostanie wykonane po otrzymaniu wyników.

Wraz ze zmianami kod wygląda następująco:

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

Więc tak jestem w stanie przekazać obiekt odpowiedzi, więc mogę wysłać imię mojego ninja :)

+1

Ach ty mnie bić się to. Przygotowałem dla ciebie fajną odpowiedź, ale dostałeś to. Będziesz chciał przekazać wywołanie zwrotne, do którego wysyłasz wyniki. – numbers1311407

Powiązane problemy