获取 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
aggregate(
[{"$set": {"size": {"$size": "$myArray"}}},
{"$setWindowFields":
{"sortBy": {"size": -1},
"output": {"position": {"$rank": {}}}}}])
我在 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
aggregate(
[{"$set": {"size": {"$size": "$myArray"}}},
{"$setWindowFields":
{"sortBy": {"size": -1},
"output": {"position": {"$rank": {}}}}}])