В методе агрегирования mongodb порядок не поддерживается - PullRequest
0 голосов
/ 08 мая 2018

У меня есть коллекция как таковая:

{_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.enemy_id [1] = Y19rvB489or4mvtxAAAD, data.enemy_id [2] = Y19rvB489or4mvtxAAAC, data.id = Y19rvB489or4mvtxAAAE

   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);

Я хочу получить результаты следующим образом: т.е. наивысшая оценка id 'Y19rvB489or4mvtxAAAD', 'Y19rvB489or4mvtxAAAC', 'Y19rvB489or4mvtxAAAE' в этом порядке. Но я не могу получить его в желаемом порядке [{Оценка: 3}, {оценка: 4}, {оценка: 5}]

1 Ответ

0 голосов
/ 08 мая 2018

$sort находится не в том месте. Это становится важным для вашего заказа после $group:

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

Этап $group будет всегда изменять порядок документов на выходе, поэтому любой $sort должен применяться там, если вы ожидать определенного заказа в ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...