2013-04-06 108 views
7

我刚开始玩猫鼬和蒙戈。我有以下代码:Mongoose find(),如何访问结果文档?

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

将条目添加到数据库没有问题,但我在检索它们时遇到问题。我对整个事情是如何工作感到困惑。我的理解如下:

有一些模式,就像oop中的类一样,只是数据库中记录的蓝图。模型是一个记录,好吧,也许更多一点,因为我看到你可以在模型中添加一个方法。那么......我真的不明白如何使用它们。你能给我一个线索是什么吗?

返回到主题:当发出find命令时,它会调用匿名函数,文档应该是正确的结果?现在我该如何访问它们?由于现在如果我登录的资源,我得到以下几点:

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

另外,如果我用Ninja.find(...,function(err,docs){ ... })我怎么走线槽的文档?或者我如何检索我的记录?

回答

15

我找到了故障。这更像是一个概念性的问题:我正在处理异步调用,并试图从另一个函数返回结果,并且不知道它何时执行。所以会发生什么是我请求执行数据库查询并返回结果,结果是null。此代码:

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

返回null,但! console.log(docs)向控制台输出数据库中的所有值,我正在尝试做什么。现在我需要进行更改,很可能会传递一个回调,在收到结果后执行回调。

随着变化的代码如下所示:

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

所以这样我可以通过响应对象,这样我就可以把我的忍者:)

+1

你丫打我的名字它。我为你制定了一个很好的答案,但你明白了。您需要传递回传结果。 – numbers1311407 2013-04-06 15:29:26

相关问题