【问题标题】:Limit number of results after query population in mongoose在猫鼬中查询填充后限制结果数
【发布时间】:2017-09-11 13:32:42
【问题描述】:

我有一个猫鼬查询,我在其中将结果数限制为 3 个条目。我的问题是,每个对象都填充了嵌套对象。这个嵌套对象有一个“活动”标志。我不想返回任何具有“活动”标志为假的嵌套对象的对象,但在限制之后应用了填充过滤器,因此结果可能为空。

是否可以在不使用另一个偏移量再次执行查询的情况下执行此类操作,直到达到限制?

例子:

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()

【问题讨论】:

  • 您可以使用 lodash 函数或 JavaScript 函数在获取结果后过滤对象。
  • 通过填充嵌套对象,您的意思是在您的情况下使用 populate 函数填充引用的对象?提供查询示例将有助于我们更好地理解场景。
  • 嗨托拜厄斯;你能edit你的问题来显示你的查询吗?如果我们知道您从什么开始,那么知道如何修改它会更容易。
  • 当然。我加了
  • @TobiasStangl 我现在面临同样的情况。你找到解决办法了吗?

标签: javascript node.js mongodb mongoose


【解决方案1】:

您可以填充多个特定的文档: 您可以通过指定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

【讨论】:

  • 谢谢,但这实际上是不可能的,因为必须先填充嵌套对象。
【解决方案2】:

问题的解决方法是使用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(results, path) 完成额外的填充。

【讨论】:

    猜你喜欢
    • 2015-09-30
    • 2015-08-26
    • 2015-11-19
    • 2023-03-21
    • 2017-05-08
    • 2023-04-11
    • 1970-01-01
    • 2019-04-06
    • 2018-12-04
    相关资源
    最近更新 更多