2015-11-12 2 views
3

Из документа, имеющего два поля, например «player_1» и «player_2». Я хотел бы объединить их, объединив их как неидентифицированное поле. Следующим шагом будет подсчет количества раз, когда значение появляется независимо от одного поля или другого. Например:Объединить два поля в одном массиве

{ 
    _id : ObjectId("52f0795a58c5061aa34d436a"), 
    "game_id": 765 
    "player_1" : 1, 
    "player_2" : 2 
} 

Would приводит к:

{ 
    "game_id": 765, 
    "player" : 1 
}, 
{ 
    "game_id": 765, 
    "player" : 2 
} 

Поскольку эти поля не являются массивами, я не нашел решение агрегировать их таким образом.

Например следующая команда агрегации не понимает, я tryining для извлечения полого документа

[ 
{ $project: { 
    game_id: true, 
    player: { $setUnion: [['$player_1'], ['$player_2']] } } 
}, 
{ $unwind: '$player' } 
] 

и результатов:

{ 
    "game_id": 765, 
    "player": "$player_1" 
}, 
{ 
    "game_id": 765, 
    "player" : "$player_2" 
} 

ответ

3

Вы должны использовать оператор $map с оператором $literal для возврата массива «игроков».

db.collection.aggregate([ 
    { $project: { 
     "game_id": 1, 
     "player": { 
      "$map": { 
       input: { $literal: [ "p1", "p2" ] }, 
       as: "p", 
       in: { 
        $cond: [ 
         { $eq: [ "$$p", "p1" ] }, 
         "$player_1", 
         "$player_2" 
        ] 
       } 
      } 
     } 
    }}, 
    { $unwind: "$player" } 
]) 

Что дает:

{ 
     "_id" : ObjectId("52f0795a58c5061aa34d436a"), 
     "game_id" : 765, 
     "player" : 1 
} 
{ 
     "_id" : ObjectId("52f0795a58c5061aa34d436a"), 
     "game_id" : 765, 
     "player" : 2 
} 
Смежные вопросы