合并一个数组中的两个字段

时间:2015-11-12 14:47:04

标签: mongodb mongodb-query aggregation-framework

来自具有两个字段的文档,例如“player_1”和“player_2”。我想通过将它们合并为一个无差别的领域来聚合它们。下一步是计算值出现的次数,无论是来自一个字段还是另一个字段。例如:

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

结果是:

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

因为这些字段不是数组,所以我没有找到以这种方式聚合它们的解决方案。

例如,以下聚合命令无法理解我正在尝试获取文档字段

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

和结果:

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

1 个答案:

答案 0 :(得分: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
}