使用 Node.js 和 Mongoose 将查询结果保存到模型/模式的属性

Posted

技术标签:

【中文标题】使用 Node.js 和 Mongoose 将查询结果保存到模型/模式的属性【英文标题】:Saving the result of a query to a property of a Model/Schema with Node.js and Mongoose 【发布时间】:2016-08-15 17:29:53 【问题描述】:

首先,我是 MEAN Stack 和 Node.js 的新手,所以放轻松 :)

我知道 Node.js 中的所有这些函数都是回调函数并且是异步的,但是由于 Node.js 被广泛使用,我认为的缺点可能根本不是缺点。让我定义我的问题;

假设您有一个用户的架构,其一个字段是对另一个架构的引用。例如

PersonSchema = 
   name: String,
   ...
   ...
   ...
   projects : [
      type: Schema.ObjectId,
      ref: 'Project',
      required: true
   ],
   ...
   ...

我如何确切地确保我从数据库中获取特定项目并使用 mongoose 添加到用户的数据库中?

我正在做的事情是这样的:

var proj = Project.findOne("name":"The Manhattan Project")

由于这些都发生在 app.post(...) 方法中,它们最终会发生,但不一定在它们应该发生的时候发生。

var newUser = new User();
newUser.name  = req.body.name;
newUser... = ...
newUser.projects = [proj.id];
...

newUser.save(callback function)

当我用这个项目保存新的用户对象时,它给了我一个错误,因为 proj 是未定义的(这是可以理解的,因为查询函数是一个回调函数)购买我真的不知道现在要解决这个问题。

谁能给我一些想法来解决这个问题,或者纠正我的理解方式,如果它是错误的,或者至少将我推向正确的方向,以便我可以通过研究找到更多资源。

非常感谢!

【问题讨论】:

【参考方案1】:

FindOne 将回调作为其第二个参数。你不应该将项目分配给它的返回,你应该调用它,然后在回调中进行你的使用逻辑......

Model.findOne( age: 5, function (err, doc)
    // doc is a Document
    // do things that happen after a sync retrieve in here...
);

【讨论】:

好的,我想我明白你的意思了。因此,您建议我通过在另一个内部调用一个回调函数来“堆叠”回调函数,以确保它们将按顺序执行,对吗?所以我应该叫这个:newUser.save(callback function) 在这个里面:Project.findOne(..., function(...) **HERE** ); 如果我弄错了,请告诉我。 是的 - 这是正确的。还有其他技术可以避免深度嵌套回调(搜索末日金字塔),但这应该有望解决您当前的执行顺序问题。

以上是关于使用 Node.js 和 Mongoose 将查询结果保存到模型/模式的属性的主要内容,如果未能解决你的问题,请参考以下文章

单个node.js项目中的Mongoose和多个数据库

单个node.js项目中的Mongoose和多个数据库

Node.js 和 Mongoose 正则表达式查询多个字段

Node.js mongoose:如何使用查询的 .in 和 .sort 方法?

存储 mongoose (node.js orm) 查询结果

存储 mongoose (node.js orm) 查询结果