来自具有两个字段的文档,例如“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"
}
答案 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
}