假设我有一个文档设置如下:
//Game
{
number: "001",
players: [
{
_id: ObjectId("123"),
lives: 0
},
{
_id: ObjectId("124"),
lives: 2
},
{
_id: ObjectId("125"),
lives: 3
},
],
totalLives: 5,
}
我想做的是建立一个综合渠道
1.设置特定游戏(使用number
)中特定玩家(使用_id
)的生命--在本例中更新玩家123
1.更新游戏的totalLives总和
我尝试了类似的方法,直到我意识到(或者更确切地说,我相信)您需要使用aggregate()
来使用$sum
操作符。
await Games.updateOne(
{
number: game.number,
"player._id": new ObjectId(newPlayer._id),
},
{
$set: {
"players.$[player].lives": newPlayer.lives,
totalLives: { $sum: "$players.lives" },
},
},
{
arrayFilters: [{ "player._id": new ObjectId(newPlayer._id) }],
}
)
1条答案
按热度按时间zsbz8rwp1#
是的,您只能通过聚合管道来实现这一点。
$set
-更新players
数组。使用$map
迭代players
数组中的每个元素,当前迭代元素的$mergeObjects
包含lives
字段,并根据条件赋值(如果不匹配,则使用现有值)。$set
-第1阶段之后的另一阶段,用于将所有players.lives
求和为totalLives
场。Demo @ Mongo Playground