我有这个mongoDB文档结构:
Game = {
_id: 'randomObjectId',
players: [Array of players ObjectIds],
maxPlayers: 2,
status: 'created' (or 'fully-booked')
}
当一个新玩家加入游戏时,我想将他添加到玩家阵列中,并将游戏的status
更改为fully-booked
,前提是满足以下条件:players.length < maxPlayers
。
概括一下:
- 如果
players.length < maxPlayers
,则在DB内部检查(使用查询( - 如果是,请更新文档
- 如果没有,则返回错误响应(可选(
如果没有此检查,很容易使用进行查询
Game.findByIdAndUpdate('randomObjectId', {
$addToSet: {
players: 'playerObjId'
},
gameStatus: 'fully-booked'
}, {
new: true
})
我不知道如何将这个条件添加到这个(或其他类型的(查询中。感谢您的帮助。感谢
您可以尝试如下聚合管道更新。但是,如果已经预订满,则该命令将返回一个null
。还要注意,如果您尝试添加数组中已经存在的玩家id,则不会添加。
db.collection.findOneAndUpdate(
{
_id: someObjectId,
$expr: {
$lt: [{ $size: "$players" }, "$maxPlayers"]
}
},
[
{
$set: {
players: { $setUnion: ["$players", [newPlayerObjectId]] }
}
},
{
$set: {
status: {
$cond: {
if: { $lt: [{ $size: "$players" }, "$maxPlayers"] },
then: "created",
else: "fully-booked"
}
}
}
}
],
{
returnNewDocument: true
})