首页 > 解决方案 > 有没有办法给 MongoDB 聚合的结果提供 order 字段?

问题描述

有没有办法给 MongoDB 聚合结果排序或排名?

我的结果是:

{
  "score":100
  "name": "John"
},
{
  "score":80
  "name": "Jane"
},
{
  "score":60
  "name": "Lee"
}

我想要的结果是:

{
  "score":100
  "name": "John",
  "rank": 1
},
{
  "score":80
  "name": "Jane"
  "rank": 2
},
{
  "score":60
  "name": "Lee"
  "rank": 3
}

我知道有一个叫做运算符$includeArrayIndex,但这仅适用于$unwind运算符。有没有办法在不使用的情况下给出排名$unwind

使用$unwind需要对我的收藏进行分组,我担心分组管道太大而无法处理。

标签: mongodbaggregation-framework

解决方案


另一种方法是$map使用它的索引在文档中使用和添加排名,不要使用$unwind阶段,因为它是单字段数组,您可以使用它的键名直接访问,如最后一行代码中提到的,

  • $group通过 null 并在数组中创建文档root数组,
  • $map迭代数组循环,root使用从根数组获取当前对象的索引$indexOfArray并使用返回的索引号递增,$add因为索引从 0 开始,这就是我们创建rank字段的方式,使用当前元素对象和rank字段合并对象$mergeObjects
let result = await db.collection.aggregate([
  {
    $group: {
      _id: null,
      root: {
        $push: "$$ROOT"
      }
    }
  },
  {
    $project: {
      _id: 0,
      root: {
        $map: {
          input: "$root",
          in: {
            $mergeObjects: [
              "$$this",
              {
                rank: { $add: [{ $indexOfArray: ["$root", "$$this"] }, 1] }
              }
            ]
          }
        }
      }
    }
  }
]);

// you can access result using root key
let finalResult = result[0]['root'];

操场


推荐阅读