node.js - 如何在首先需要填充的嵌套对象上使用光标?
问题描述
说有两种模式:User
和Order
。User
模式有一个属性,Orders
它是一个Order
对象 ID 的数组,如下所示:
Orders: [{
ref: 'Order',
type: mongoose.Schema.Types.ObjectId
}]
如何遍历填充 Orders
有光标的用户?理想情况下,我正在寻找这样的东西:
User.find({ _id: userID }).
.cursor('Orders')
.eachAsync(async (order) => {
// Do something with each order
});
我想使用游标,因为所有订单都无法放入内存。
我考虑过的替代方案#2:
const user = await User.findById(userID);
Order.find({ _id: $in: user.Orders }).cursor().eachAsync(...);
我考虑过的替代方案#3:UserID
向 Order 模式添加一个字段并执行以下操作:
const user = await User.findById(userID);
Order.find({ UserID: user._id }).cursor().eachAsync(...);
我只是在寻找执行这些类型查询的最有效方法。
解决方案
这一切都取决于订单的大小
- 如果您期望数十个订单 #1 会足够高效,
- 如果大于此 #2 将是一种更有效的方法,提供订单中的 UserID 字段被索引,同样在这种情况下,您不必将单个订单存储在用户对象的 Orders 数组中。
在这里查看您的选项的一个很好的解释
或者,您可以使用聚合框架并在单个操作中完成所有这些操作,但它不会比 #2 或 #3 更有效,除非您想返回多个用户的订单。
推荐阅读
- reactjs - 如何在 ReactJS 中完成组件的介绍动画之前禁用悬停动画?
- acumatica - Acumatica MoveEntry API 不生成批号
- jquery - 如何停止显示(几秒钟)已删除的文本(wordpress)?
- python - 使用游戏中的帧调用预测时,捕获帧的 Keras 错误
- python - 如果我试图预测样本的标签,但样本缺少特征,我应该如何处理?
- mongoose - Mongoose 中 GeoJSON 的默认值
- oracle - 使用输出参数执行存储过程时出现 Oracle OCI 错误
- python - TF.Keras 中具有多输出模型的单损失
- ios - 如何在 SwiftUI 中结束 UIViewRepresentable 的编辑?
- flutter - 如何在颤动中发出可忽略的警报?