Вопрос:

Mongoose Aggregate: ограничить количество записей в $ group

node.js mongodb mongoose aggregation-framework

1134 просмотра

1 ответ

594 Репутация автора

Я пытаюсь преобразовать это предложение, используя метод Mongoose Aggregate:

«Для каждого игрока с данным oid выберите игру, в которую играли чаще всего». Вот моя игровая схема:

gameSchema = new mongoose.Schema({
     game_name:{type:String},
     game_id:{type:String},
     oid:{type: String},
     number_plays:{type:Number,default:0},
    })
Game = mongoose.model('Game', gameSchema);

Вот код, который я использую:

var allids = ['xxxxx','yyyy'];
Game.aggregate([
    {$match: {'oid': {$in:allids}}},
    {$sort: {'number_plays': -1}},
    {$group: {
        _id: '$oid', 
        plays:{$push:"$number_plays"}, 
        instructions:{$push:"$game_instructions"}
    }}
], function(err,list){
    console.log(list);
    res.end();
});

Код выше возвращает следующее:

[ { _id: 'yyyy', plays: [ 10,4,5 ] },
  { _id: 'xxxxx',
    plays: [ 28, 14, 10, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0 ] } ]

Проблема в том, что он возвращает все игры, а не ту, в которую чаще всего играли. Итак, мой вопрос: возможно ли ограничить поля, заполненные в группе $?

Автор: Cyril Gaillard Источник Размещён: 29.08.2014 11:36

Ответы (1)


2 плюса

229719 Репутация автора

Решение

Вы можете использовать $firstдля получения значений из первого документа в каждой группе отсортированного конвейера:

var allids = ['xxxxx','yyyy'];
Game.aggregate([
    {$match: {'oid': {$in:allids}}},
    {$sort: {'number_plays': -1}},
    {$group: {
        _id: '$oid', 
        game_name: {$first: "$game_name"}, 
        game_id: {$first: "$game_id"}, 
        number_plays: {$first:"$number_plays"}
    }}
], function(err,list){
    console.log(list);
    res.end();
});

Так как вы сортировали по number_playsубыванию на предыдущем этапе конвейера, это будет принимать значения из документа каждой oidгруппы с наибольшим number_plays.

Автор: JohnnyHK Размещён: 29.08.2014 12:45
Вопросы из категории :
32x32