如何在首先需要填充的嵌套对象上使用游标?

时间:2019-04-11 00:17:09

标签: node.js mongoose mongoose-schema mongoose-populate

说a有两种模式: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(...);

我只是在寻找一种最有效的方式来执行这些类型的查询。

1 个答案:

答案 0 :(得分:0)

这完全取决于订单的大小

  1. 如果您希望数十个订单#1足够有效,
  2. 如果大于此#2,将提供更有效的方法 订单中的UserID字段已编制索引,在这种情况下,您也没有 将单个订单存储在User对象的Orders数组中。

查看有关您的选项here

的详细说明

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