获取 MongoDB 聚合中的单个文档位置

Getting single document position in MongoDB aggregate

我在 MongoDB 中遇到了一个看似简单的问题,但我在网上搜索时运气不佳。

我有一个看起来像这样的集合:

{ "id" : 'a18qv5k', "name" : "Joe", "myArray" : ['foo']}
{ "id" : 'cbuesvhg', "name" : "Adam", "myArray" : ['foo', 'bar', 'sample text']}
{ "id" : 'h106pw97', "name" : "Bill", "myArray" : ['bar', 'lorem ipsum']}

我想 运行 对 return 整个集合进行聚合查询,按 myArray 中包含的元素数排序。我已经找到了一种方法:

const aggregation = [{
    $project: {
        id: 0,
        name: 1,
        dim: {
            $size: '$myArray'
        }
    }
}, {
    $sort: {
        dim: -1
    }
}];

下一步(我正在苦苦挣扎)将向每个投影文档添加一个 position 属性,显示其在 returned 集合中的位置。结果如下:

{ "name" : "Adam", dim : 3, position: 1}
{ "name" : "Bill", dim: 2, position: 2}
{ "name" : "Joe", dim: 1, position: 3}

查询

  • $setWindowFields可以做到,需要>=MongoDB5
  • 这里使用了 $rank,即使数组大小相同,每个文档也会有不同的排名,如果您希望相同的数组大小具有相同的排名,您也可以使用 $denseRank 而不是$rank

Playmongo

aggregate(
[{"$set": {"size": {"$size": "$myArray"}}},
 {"$setWindowFields": 
   {"sortBy": {"size": -1},
    "output": {"position": {"$rank": {}}}}}])