填充MongoDB(Mongoose)后限制查询结果

时间:2017-06-23 17:29:53

标签: node.js mongodb mongoose mongodb-query mongoose-populate

我在这里问你一个让我在几个项目中挣扎的问题,我不知道哪个是最好的方法。

问题是:

我正在查询具有此架构的名为 Likes 的MongoDB集合:

  user: { type: Schema.Types.ObjectId, ref: 'User', required: true, index: true },
  product: { type: Schema.Types.ObjectId, ref: 'Product', index: true },
  list: { type: Schema.Types.ObjectId, ref: 'List', index: true },
  deleted: { type: Boolean, default: false }

我想获取属于某个用户的所有项目,但尚未删除,并且已分页。在同一个查询中,我想填充那些文档的某些字段,所以我这样做:

Like.find({ user: req.params.user_id, deleted: false })
  .skip((page - 1) * limit)
  .limit(limit)
  .populate([
    { path: 'product'},
    {
      path: 'list',
      match: { deleted: false },
      populate: [
        { path: 'items.product' },
        { path: 'users.user' }
      ]
    }
  ])

它按预期工作。但问题是,由于我们在populate函数中匹配未删除的列表,因此有些文档将list属性设置为null。

我们希望在没有任何空列表的情况下尽可能多地返回文档,但是我们无法将它们过滤掉。因为如果查询返回24个项目,并且我们过滤掉其中的2个项目,则返回结果的数量与限制之间将存在差距。

哪种方法最好?我也尝试使用聚合,但由于我们需要填充许多东西,它会变得混乱。

0 个答案:

没有答案