Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在mongodb聚合方法中,未维护顺序_Node.js_Mongodb - Fatal编程技术网

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)=>{
      ...