如何使用mongoose将查询结果返回给变量

时间:2013-12-20 09:09:34

标签: node.js mongodb mongoose

我还在学习Node.js和Moongoose的阶段,我有一个场景在

  • 我从表单提交中获取价值(ABC)。这是用户名称
  • 然后我在用户集合(用户)
  • 中搜索该名称
  • 获取该用户并使用ref。
  • 在另一个模式(文章)中编写其ObjectID

我的逻辑:

article.owner = User.findOne({ 'name' : 'ABC' })
    .exec(function (err, user){
         return user
    })

但它没有返回结果。我提到了其他一些答案并试了async.parallel但是我仍然无法在article.owner的文章架构中保存ABC用户的objectID。我总是得到空。

请建议我任何其他更好的方法。

3 个答案:

答案 0 :(得分:3)

当Node必须执行任何I / O操作时,例如从数据库读取,它将异步完成。像User.findOneQuery#exec这样的方法永远不会提前返回结果,因此在您的示例中article.owner将无法正确定义。

异步查询的结果只能在回调中使用,只有在I / O完成时才会调用

article.owner = User.findOne({ name : 'ABC' }) .exec(function (err, user){    
    // User result only available inside of this function!
    console.log(user) // => yields your user results
})

// User result not available out here!
console.log(article.owner) // => actually set to return of .exec (undefined)

上面示例中的异步代码执行意味着什么:当Node.js命中article.owner = User.findOne...时,它将执行User.findOne().exec(),然后在console.log(article.owner)完成之前直接移至.exec

希望有助于澄清。需要一段时间才能习惯异步编程,但通过更多练习

会有意义

更新要回答您的具体问题,一种可能的解决方案是:

User.findOne({name: 'ABC'}).exec(function (error, user){
    article.owner = user._id; // Sets article.owner to user's _id
    article.save()            // Persists _id to DB, pass in another callback if necessary
});

如果您想使用以下文章加载您的用户,请务必使用Query#populate

Article.findOne({_id: <some_id>}).populate("owner").exec(function(error, article) {
    console.log(article.owner); // Shows the user result
});

答案 1 :(得分:1)

User.findOne({ 'name' : 'ABC' }) .exec(function (err, user){
    article.owner = user.fieldName;
})

答案 2 :(得分:1)

hexacyanide的答案显示了如何通过另一个回调从异步数据库查找回调中传输数据。保存我的项目!

Set Variable to result of Mongoose Find