gpt4 book ai didi

javascript - 基于关闭条件的文档中各个字段的聚合计数

转载 作者:可可西里 更新时间:2023-11-01 10:38:47 25 4
gpt4 key购买 nike

我希望能够获取某些值,并根据哪个键具有特定 ID 来计算这些值在集合中的次数。例如,这是来自游戏日志集合的单个文档的示例

{
"_id": "5af88940b73b2936dcb6dfdb",
"date": "2018-05-13T18:51:44.548Z",
"playerOne": "5af888d0b73b2936dcb6dfd3",
"playerOneThrew": "Scissors",
"playerTwo": "5af88918b73b2936dcb6dfd7",
"playerTwoThrew": "Rock",
"winner": "5af88918b73b2936dcb6dfd7",
"__v": 0
}

我希望能够根据玩家 ID(可以是 playerOne 或 playerTwo)进行查询,并收回玩家为每场比赛投出的手。本质上,我希望能够通过玩家 ID 获得所有游戏的所有手牌(石头、布、剪刀)的总数。

有没有办法为集合中所有文档的每个“抛出的手”值汇总一个计数并返回类似

的内容
{
"player": "5af888d0b73b2936dcb6dfd3",
"Rock": 3,
"Paper": 6,
"Scissors": 12
}

我的想法是根据哪个id匹配playerOne来设置一个变量|| playerTwo 然后在 switch 语句中使用该变量,我在其中汇总了“rock”、“paper”、“scissors”的计数。问题是我刚开始使用 MongoDB,我很难理解像这样的查询的正确语法。

这是我现在所在的位置

GameLogs.aggregate(
[
{
$let: {
vars: {
playerThrew: {
$cond: {
if: {
$eq: { playerOne: id },
}
}, then: playerOneThrew, else: playerTwoThrew
}
}
}
},
{
$switch: {
branches: [
{ case: { $eq: 'Rock' }, then: { $count: 'Rock' } },
{ case: { $eq: 'Paper' }, then: { $count: 'Paper' } },
{ case: { $eq: 'Scissors' }, then: { $count: 'Scissors' } },
]
}
}
]
)

伪代码

if playerOne == id
playerThrew = playerOneThrows
else if playerTwo == id
playerThrew = playerTwoThrows

switch playerThrew {
case 'rock':
rockCount++
break
case 'paper':
paperCount++
break
case 'scissors':
scissorsCount++
break
}

return {
player_id: id,
rock: rockCount,
paper: paperCount,
scissors: scissorCount
}

如有任何见解,我们将不胜感激。

最佳答案

Radosław Miernik 的回答很好,但仍然需要 $match,因为 OP 只想获取特定玩家的数据。

假设 playerId 是需要其数据的玩家的 _id

下面的代码应该可以工作,并给出预期的结果

collection.aggregate([
{$project: {
player: [
{id: '$playerOne', threw: '$playerOneThrew'},
{id: '$playerTwo', threw: '$playerTwoThrew'}
],
}},
{$unwind: '$player'},
{$match : {
"player.id" : playerId
}},
{$group: {
_id: '$player.id',
player : {$first : "$player.id},
Paper: {$sum: {$cond: [{$eq: ['$player.threw', 'Paper' ]}, 1, 0]}},
Rock: {$sum: {$cond: [{$eq: ['$player.threw', 'Rock' ]}, 1, 0]}},
Scissors: {$sum: {$cond: [{$eq: ['$player.threw', 'Scissors']}, 1, 0]}}
}}
])

这将给出您正在寻找的确切结果,以及一个额外的 _id 字段。

{
"_id": "5af888d0b73b2936dcb6dfd3",
"player": "5af888d0b73b2936dcb6dfd3",
"Rock": 3,
"Paper": 6,
"Scissors": 12
}

关于javascript - 基于关闭条件的文档中各个字段的聚合计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51117286/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com