mongodb中对象嵌套数组的聚合查询

mongodb中对象嵌套数组的聚合查询,mongodb,mongoose,mongodb-query,aggregation-framework,Mongodb,Mongoose,Mongodb Query,Aggregation Framework,我有以下收藏。每个文件可表示为以下内容。每个文档可以有多个客户推荐人 { _id:objectId(""), customerId: "Some Id", name: "Customer name", customerReferee: [ { status: 'COMPLETED', name: "Referee name1" }, { status:

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

{
  _id:objectId(""),
  customerId: "Some Id",
  name: "Customer name",
  customerReferee: [
   {
     status: 'COMPLETED',
     name: "Referee name1"
   },
   {
     status: 'PENDING',
     name: "Referee name2"
   },
  ],
}
我希望拥有最多“已完成”客户引用数量的前20个文档。

  • $match
    状态条件
  • $filter
    迭代
    customerReferee
    数组的循环,并按
    状态进行过滤
  • $size
    获取上述筛选结果中的元素总数
  • $sort
    按总计元素排序,我们已按降序添加了一个字段
    customerRefereeSize
  • $skip
    从0开始光标
  • $limit
    获取前20个元素

您的问题不清楚,20份文件中“已完成”的最大数量=>描述了“已完成”的最大数量意味着多少?可以有任意数量的已完成的裁判。我想以降序排列文件,其中完成的裁判数最多的文件将是第一个,随后是比第一个裁判数较少的文件。我要这类文件的前20份@turivishal谢谢@turivishal。它在操场上工作,但在我的数据库中抛出“无法识别的管道阶段名称:'$set'”,“代码”:40324,'此错误。原因可能是什么?我不确定,但请尝试
$addFields
而不是
$set
,让我知道它是否工作。感谢更新。现在错误消失了,工作正常。✌
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 }
])