Node.js 在mongodb聚合方法中,未维护顺序
我有这样一个收藏:Node.js 在mongodb聚合方法中,未维护顺序,node.js,mongodb,Node.js,Mongodb,我有这样一个收藏: {_id:ObjectId("5aa59c8411c5de25042a06fd"), id: Y19rvB489or4mvtxAAAC, score: 2 } {_id:ObjectId("5aa59c8b11c5de25042a06fe"), id: Y19rvB489or4mvtxAAAC, score: 4 } {_id:ObjectId("5aa59c8411c5de25042a0hehb"), id: Y19rvB489or4mvtxAAAD, scor
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAC,
score: 2
}
{_id:ObjectId("5aa59c8b11c5de25042a06fe"),
id: Y19rvB489or4mvtxAAAC,
score: 4
}
{_id:ObjectId("5aa59c8411c5de25042a0hehb"),
id: Y19rvB489or4mvtxAAAD,
score: 3
}
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAD,
score: 2
}
{_id:ObjectId("5aa59c8411c5de25042a0j3bb"),
id: Y19rvB489or4mvtxAAAE,
score: 5
}
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAE,
score: 4
}
{_id:ObjectId("5aa59c8411c5de250wer46fs"),
id: Y19rvB489or4mvtxAAAF,
score: 2
}
{_id:ObjectId("5aa59c8411c5de250423e6fg"),
id: Y19rvB489or4mvtxAAAF,
score: 2
}
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAC,
score: 2
}
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAC,
score: 2
}
{_id:ObjectId("5aa59c8411c5de25042a06fd"),
id: Y19rvB489or4mvtxAAAC,
score: 2
}
我使用这个查询是为了能够按照我想要的顺序(即参数中传递的顺序)获取结果。此处data.敌方id[1]=Y19RVB489OR4MVTXAAD,data.敌方id[2]=Y19RVB489OR4MVTXAAC,data.id=Y19RVB489OR4MVTXAAE
var order =[data.enemy_id[1],data.enemy_id[0],data.id];
db.collection('Scores').aggregate([
{$match: {id:{$in:order}}},
{$addFields: {"__order": {$indexOfArray: [order, "$id" ]}}},
{$sort: {"__order": 1}},
{$group: {_id:'$id',score:{$max:'$score'}}},
{$project: {_id:0,score:1}}
]).toArray().then((docs)=>{
var score1 = JSON.stringify(docs,undefined,2);
var score1 = JSON.parse(score1);
console.log(score1);
我想以这种方式获取结果:;i、 e.id“Y19RVB489或4Mvtxaad”、“Y19RVB489或4Mvtxaac”、“Y19RVB489或4Mvtxaae”在此顺序中的最高分数。但我不能按预定的方式取
[{score:3},{score:4},{score:5}]。只有在以下内容之后,它才对您的订购变得重要:
var order=[data.敌方id[1],data.敌方id[0],data.id];
db.集合(“分数”).聚合([
{$match:{id:{$in:order}},
{$addFields:{“{uu顺序”:{$indexOfArray:[顺序,$id]},
//{$sort:{“\uu顺序”:1},//添加一个“$first”:“$\uu顺序”$group
中的$sort
,并在$group
之后应用$sort
,字段仍在那里。我假定id
值是数组中的值,因此所有匹配项都将具有相同的索引。使用$first
@NeilLunn保留它。您是在告诉我:{$group:{$first:{$first:$order:“$\u”,_id:'$id',分数:{$max:'$score'}}??
var order =[data.enemy_id[1],data.enemy_id[0],data.id];
db.collection('Scores').aggregate([
{$match: {id:{$in:order}}},
{$addFields: {"__order": {$indexOfArray: [order, "$id" ]}}},
// {$sort: {"__order": 1}}, // <-- remove this one
// Keep the __order field in the next stage
{$group: {_id:'$id',score:{$max:'$score'}, "__order": { "$first": "$__order" } }},
{$sort: {"__order": 1}}, // <-- move to here to actually sort
{$project: {_id:0,score:1}}
]).toArray().then((docs)=>{
...