首页 > 解决方案 > 如何在首先需要填充的嵌套对象上使用光标?

问题描述

说有两种模式:UserOrderUser模式有一个属性,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(...);

我只是在寻找执行这些类型查询的有效方法。

标签: node.jsmongoosemongoose-schemamongoose-populate

解决方案


这一切都取决于订单的大小

  1. 如果您期望数十个订单 #1 会足够高效,
  2. 如果大于此 #2 将是一种更有效的方法,提供订单中的 UserID 字段被索引,同样在这种情况下,您不必将单个订单存储在用户对象的 Orders 数组中。

在这里查看您的选项的一个很好的解释

或者,您可以使用聚合框架并在单个操作中完成所有这些操作,但它不会比 #2 或 #3 更有效,除非您想返回多个用户的订单。


推荐阅读