我使用includeArrayIndex添加基于排序的排名
下面是聚合查询
dbo.collection("funds").aggregate([
{
"$sort": {
"amount": -1
}
},
{
"$group": {
"_id": "",
"items": {
"$push": "$$ROOT"
}
}
},
{
"$unwind": {
"path": "$items",
"includeArrayIndex": "items.rank"
}
},
{
"$replaceRoot": {
"newRoot": "$items"
}
},
{
"$sort": {
"rank": -1
}
}
])
这将分配rank
字段,但从0开始,是否有办法从1开始
我试过这样的布景
[
{
'$sort': {
'amount': -1
}
}, {
'$group': {
'_id': '',
'items': {
'$push': '$$ROOT'
}
}
}, {
'$unwind': {
'path': '$items',
'includeArrayIndex': 'items.rank'
}
}, {
'$replaceRoot': {
'newRoot': '$items'
}
},
{
'$set': {
'rank': {
'$add': [
'$rank', 1
]
}
}
},
// {
// '$sort': {
// 'rank': 1
// }
// }
]
在mongodb Compass aggregation选项卡中,它显示添加了该字段,但是当我使用nodejs运行此脚本时,它没有添加rank
字段
即使我试过
const a = await dbo.collection("funds").aggregate(
[
{
'$sort': {
'amount': 1
}
}, {
'$group': {
'_id': '',
'items': {
'$push': '$$ROOT'
}
}
}, {
'$unwind': {
'path': '$items',
'includeArrayIndex': 'items.rank'
}
}, {
'$replaceRoot': {
'newRoot': '$items'
}
},
{
'$addFields': {
'rank': {
'$add': [
'$rank', 1
]
}
}
}
]
).toArray();
这甚至在控制台上打印为
[
{ _id: new ObjectId("6220d2fe20e33d48c865b720"), amount: 1, rank: 1 },
{
_id: new ObjectId("6220d2cf20e33d48c865b71e"),
amount: 10,
rank: 2
},
{
_id: new ObjectId("6220d2f520e33d48c865b71f"),
amount: 12,
rank: 3
}
]
然后尝试使用$setWindowFields
dbo.collection("funds").aggregate( [
{
$setWindowFields: {
sortBy: { amount: -1 },
output: {
rank: {
$rank: {}
}
}
}
}
] )
但它表明
err MongoServerError: Unrecognized pipeline stage name: '$setWindowFields'
示例文档如下所示
[
{amount : 20, name :""},
{amount : 22, name :""}
]
1条答案
按热度按时间2izufjch1#
不确定是否已回答此问题。但您只需添加{ $out:“funds”}在您的代码末尾。PFB工作代码...