【问题标题】:Aggregation queries on nested array of objects in mongodbmongodb中嵌套对象数组的聚合查询
【发布时间】:2021-08-13 15:07:06
【问题描述】:

我有以下收藏。每个文档可以表示如下。每个文档可以有多个客户推荐人。

{
  _id:objectId(""),
  customerId: "Some Id",
  name: "Customer name",
  customerReferee: [
   {
     status: 'COMPLETED',
     name: "Referee name1"
   },
   {
     status: 'PENDING',
     name: "Referee name2"
   },
  ],
}

我想要前 20 个文档中的“已完成”customerReferees 数量最多。

【问题讨论】:

  • 你的问题不是很清楚,20个文档的'COMPLETED'的最大数量 =>描述最大意味着多少?
  • 可以有任意数量的 COMPLETED 裁判。我想按降序排列文档,其中 COMPLETED 裁判数最多的文档将是第一个,而裁判数少于第一个的文档将是第一个。我想要前 20 个这样的文件。 @turivishal

标签: mongodb mongoose mongodb-query aggregation-framework


【解决方案1】:
  • $match状态条件
  • $filter 迭代循环 customerReferee 数组 nad 过滤器 status
  • $size 获取上述过滤结果中的总元素
  • $sort 按总元素,我们已按降序添加字段 customerRefereeSize
  • $skip 从 0 开始光标
  • $limit 获取前 20 个元素
db.collection.aggregate([
  { $match: { "customerReferee.status": "COMPLETED" } },
  {
    $addFields: {
      customerRefereeSize: {
        $size: {
          $filter: {
            input: "$customerReferee",
            cond: { $eq: ["$$this.status", "COMPLETED"] }
          }
        }
      }
    }
  },
  { $sort: { customerRefereeSize: -1 } },
  { $skip: 0 },
  { $limit: 20 }
])

Playground

【讨论】:

  • 谢谢@turivishal。它在操场上工作,但在我的数据库中它抛出“无法识别的管道阶段名称:'$set'”,“代码”:40324,'这个错误。可能是什么原因?
  • 我不确定,但请尝试 $addFields 而不是 $set,让我知道它是否有效。
  • 感谢更新。现在错误消失了,它工作正常。 ✌??
猜你喜欢
  • 2018-09-10
  • 1970-01-01
  • 2020-01-24
  • 1970-01-01
  • 1970-01-01
  • 2020-07-27
  • 2020-04-23
  • 1970-01-01
  • 2015-03-10
相关资源
最近更新 更多