2015-11-12 29 views
3

从具有两个字段的文档中,例如“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 
} 

因为这个领域是不是数组,我还没有发现聚集他们这样的解决方案。

例如以下aggregation命令不明白我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 
}