限制在mongoose中查询填充后的结果数

时间:2017-03-15 08:04:35

标签: javascript node.js mongodb mongoose

我有一个mongoose查询,其中我限制结果的数量,让我们说3个条目。我的问题是,每个对象都填充了嵌套对象。这个嵌套对象有一个" active" -flag。我不想返回任何具有嵌套对象的对象,其中"活动" -flag为false,但是在限制之后应用了填充过滤器,因此结果可能为空。

是否有可能做到这样的事情而不再使用另一个偏移再次执行查询,直到达到限制为止?

示例:

Activity.find(query)
        .skip(offset)
        .limit(limit)
        .sort({timestamp: -1})
        .populate('source')
        .exec()

偏移量和限制用于无限滚动功能。

我试过的是这个:

Activity.find(query)
        .skip(offset)
        .populate('source').
        .where('source.active').equals(true)
        .limit(limit)
        .sort({timestamp: -1})
        .exec()

2 个答案:

答案 0 :(得分:0)

您可以填充多个文档: 您可以通过指定pathmatch来填充多个文档,您可以在其中选择有效文档,也可以使用options

Activity
  .find(query)
  .skip(offset)
  .populate({
    path: 'source',
    match: {
      active: true
    }
  })
  .limit(limit)
  .sort({
    timestamp: -1
  })
  .exec()

有关详细信息,请查看文档http://mongoosejs.com/docs/populate.html

答案 1 :(得分:0)

问题的解决方案是使用mongoose(https://docs.mongodb.com/manual/aggregation/)的聚合框架。

之后,代码如下(简化):

Activity.
  .aggregate([
    {
      $lookup: {
        from: 'users',
        localField: 'source',
        foreignField: '_id',
        as: 'user_docs'
      }
    },
    {
      $match: {
        user_docs: {
          $elemMatch: {
            active: true
          }
        }
    },
    {$limit: options.limit},
    {$sort: {timestamp: -1}}
    ]);

之后可以通过Model.populate(结果,路径)完成额外的人口。