mongodb 中两个字段的总出现次数
sum number of occurrences on two fields in mongodb
我有一个叫games的文档合集,长这样
{ winner: 'oakis', loser: 'test' },
{ winner: 'test', loser: 'oakis' }
现在我想MongoDB输出这个:
{ _id: 'oakis', wins: 1, losses: 1 },
{ _id: 'test', wins: 1, losses: 1 }
我一直在研究聚合、mapReduce 和 distinct,但没有成功。
我希望你能帮助我!
编辑:
我有一个名为 "tied" 的字段,它也是一个布尔值。我怎样才能在结果中实现绑定游戏? (游戏中的每个玩家也有一个字段,player1 & player2)
结果应该是:
{ _id: 'name', wins: 3, losses: 1, tied: 1 }
编辑 2:
这样解决了!
db.games.aggregate([
{
$project: {
scores: [
{ name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 }, tied: { $literal: 0 } },
{ name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 }, tied: { $literal: 0 } },
{ name: '$player1', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } },
{ name: '$player2', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } }
]
}
},
{
$unwind: '$scores'
},
{
$group: {
_id: "$scores.name",
wins: { $sum: "$scores.wins" },
losses: { $sum: "$scores.losses" },
tied: { $sum: "$scores.tied" }
}
}
])
借助聚合框架,您可以使用如下所示的管道。本质上,它首先将数据投影到 [{name: $winner, wins: 1, losses: 0}, {name: $loser, wins: 0, losses: 1}]
形式的 2 元素数组中,然后展开数组以生成单个元素数组,然后按名称分组,并总结出得失。
games.aggregate(
[
{
$project: {
scores: [
{ name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 } },
{ name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 } }
]
}
},
{
$unwind: '$scores'
},
{
$group: {
_id: "$scores.name",
wins: { $sum: "$scores.wins" },
losses: { $sum: "$scores.losses" }
}
}
]
)
我有一个叫games的文档合集,长这样
{ winner: 'oakis', loser: 'test' },
{ winner: 'test', loser: 'oakis' }
现在我想MongoDB输出这个:
{ _id: 'oakis', wins: 1, losses: 1 },
{ _id: 'test', wins: 1, losses: 1 }
我一直在研究聚合、mapReduce 和 distinct,但没有成功。 我希望你能帮助我!
编辑:
我有一个名为 "tied" 的字段,它也是一个布尔值。我怎样才能在结果中实现绑定游戏? (游戏中的每个玩家也有一个字段,player1 & player2)
结果应该是:
{ _id: 'name', wins: 3, losses: 1, tied: 1 }
编辑 2:
这样解决了!
db.games.aggregate([
{
$project: {
scores: [
{ name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 }, tied: { $literal: 0 } },
{ name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 }, tied: { $literal: 0 } },
{ name: '$player1', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } },
{ name: '$player2', wins: { $literal: 0 }, losses: { $literal: 0 }, tied: { $cond: [ "$tied", 1, 0 ] } }
]
}
},
{
$unwind: '$scores'
},
{
$group: {
_id: "$scores.name",
wins: { $sum: "$scores.wins" },
losses: { $sum: "$scores.losses" },
tied: { $sum: "$scores.tied" }
}
}
])
借助聚合框架,您可以使用如下所示的管道。本质上,它首先将数据投影到 [{name: $winner, wins: 1, losses: 0}, {name: $loser, wins: 0, losses: 1}]
形式的 2 元素数组中,然后展开数组以生成单个元素数组,然后按名称分组,并总结出得失。
games.aggregate(
[
{
$project: {
scores: [
{ name: '$winner', wins: { $literal: 1 }, losses: { $literal: 0 } },
{ name: '$loser', wins: { $literal: 0 }, losses: { $literal: 1 } }
]
}
},
{
$unwind: '$scores'
},
{
$group: {
_id: "$scores.name",
wins: { $sum: "$scores.wins" },
losses: { $sum: "$scores.losses" }
}
}
]
)