为啥在 mongoose 中需要 execPopulate 方法来填充现有文档?

Posted

技术标签:

【中文标题】为啥在 mongoose 中需要 execPopulate 方法来填充现有文档?【英文标题】:Why is execPopulate method required in mongoose for populating an existing document?为什么在 mongoose 中需要 execPopulate 方法来填充现有文档? 【发布时间】:2021-07-13 09:41:20 【问题描述】:

我知道它的语法和它的工作原理,但我无法理解其内部工作原理,为什么方法链接一次需要另一个方法,而其他时候不需要?

这段代码运行良好

const cart = await Carts.findById(cartId).populate('product');

但是这段代码没有

let cart = await Carts.findById(cartId);
cart = await cart.populate('product');

为了让它工作,我们使用execPopulate 方法,就像这样工作。

let cart = await Carts.findById(cartId);
cart = await cart.populate('product').execPopulate();

现在,据我阅读 javascript 中的方法链接,代码在没有 execPopulate 方法的情况下也应该可以正常运行。但我似乎无法理解为什么 populate 不适用于现有的 mongoose 对象。

【问题讨论】:

【参考方案1】:

请注意execPopulate()现已被删除:https://mongoosejs.com/docs/migrating_to_6.html#removed-execpopulate

【讨论】:

他们说超级英雄不存在。 如果 execPopulate 有任何替代品,请告诉我们【参考方案2】:

Carts.findById(cartId); 返回查询对象。

当您使用await Carts.findById(cartId); 时,它会返回文档,因为它将解析承诺并获取结果。

await 运算符用于等待 Promise。


let cart = await Carts.findById(cartId); // cart document fetched by query
cart = await cart.populate('product'); // you can't run populate method on document

有效案例

const cartQuery = Carts.findById(cartId);
const cart = await cartQuery.populate('product');

.execPopulate 是文档上的方法,而.populate 作用于查询对象。

【讨论】:

【参考方案3】:

您在两种不同类型的对象上使用populate() 方法——即querydocument——它们有自己的方法规范。

https://mongoosejs.com/docs/api/query.html#query_Query-populate https://mongoosejs.com/docs/api/document.html#document_Document-populate

【讨论】:

谢谢,前几天我也在想同样的事情。

以上是关于为啥在 mongoose 中需要 execPopulate 方法来填充现有文档?的主要内容,如果未能解决你的问题,请参考以下文章

为啥默认情况下不需要 mongoose 中的所有字段?

当我“更新”时,Mongoose 操作字段是“查找”,为啥?

为啥有 Mongoose 模型而不仅仅是模式/文档? [复制]

我们为啥需要,使用猫鼬有啥优势[关闭]

关于NodeJs为啥要用mongoose操作mongodb

为啥我在循环中的 Mongoose 查询只返回第一个结果?