为什么猫鼬需要 execPopulate 方法来填充现有文档?
Why is execPopulate method required in mongoose for populating an existing document?
我知道它的语法和它是如何工作的,但我不明白它的内部工作原理,为什么一个方法链一次需要另一个方法,而其他时候不需要?
这段代码工作正常
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()
方法 - 即 query
和 document
- 它们有自己的方法规范。
https://mongoosejs.com/docs/api/query.html#query_Query-populate
https://mongoosejs.com/docs/api/document.html#document_Document-populate
Carts.findById(cartId);
returns 查询对象。
当您使用 await Carts.findById(cartId);
时,它 returns 文档,因为它将解决承诺并获取结果。
The await operator is used to wait for a 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 is method on document, while .populate 适用于查询对象。
请注意,execPopulate()
现已被删除:https://mongoosejs.com/docs/migrating_to_6.html#removed-execpopulate
我知道它的语法和它是如何工作的,但我不明白它的内部工作原理,为什么一个方法链一次需要另一个方法,而其他时候不需要?
这段代码工作正常
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()
方法 - 即 query
和 document
- 它们有自己的方法规范。
https://mongoosejs.com/docs/api/query.html#query_Query-populate https://mongoosejs.com/docs/api/document.html#document_Document-populate
Carts.findById(cartId);
returns 查询对象。
当您使用 await Carts.findById(cartId);
时,它 returns 文档,因为它将解决承诺并获取结果。
The await operator is used to wait for a 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 is method on document, while .populate 适用于查询对象。
请注意,execPopulate()
现已被删除:https://mongoosejs.com/docs/migrating_to_6.html#removed-execpopulate