如何根據其 objectId 參考的檔案值更新 MongoDB 檔案?(我通過貓鼬使用 MongoDB)
假設我有兩個集合。一種叫做比賽,另一種叫做游戲。一場比賽可以有幾場比賽。請參閱下面的代碼示例
// competition documents
[
{
compeititionName:"myCompetition",
games:["617...b16", "617...b19", "617...b1c",
competitionStatus:"notStarted",
},
{
compeititionName:"yourCompetition",
games:["617...b18", "617...b19", "617...b1c",
competitionStatus:"playing",
},
{
compeititionName:"ourCompetition",
games:["617...b14", "617...b19", "617...b2b",
competitionStatus:"ended",
}
]
competitionStatus以上取決于該比賽中比賽的狀態。
如果所有的比賽都還沒有開始,那么比賽應該notStarted是它的competitionStatus。但是,如果任何一場比賽正在進行,或者有比賽尚未開始,而其他比賽已經完成,那么比賽狀態應該是playing。最后,如果所有比賽都結束了,比賽狀態應該是ended。游戲集合的外觀示例如下:
// game documents
[
{
_id:"617...b16",
gameStatus:"notStarted"
},
{
_id:"617...b18",
gameStatus:"playing"
},
{
_id:"617...b14",
gameStatus:"ended"
},
]
如何更新狀態剛剛更改的游戲的competitionStatus給定?_id
uj5u.com熱心網友回復:
既然是貓鼬,你先選擇你要更新的模型:
const completion = await CompletionModel.FindOne({games: _id_of_the_game});
然后匯總所有游戲的狀態:
const statuses = await GameModel.aggregate([
{$match: {_id: {$in: completion.games}}},
{$group: {_id: gameStatus}}
]).toArray();
然后應用您的業務邏輯來設定狀態:
if(statuses.leength === 1) { // all games have same status
if(statuses[0]._id === "notStarted") {
completion.competitionStatus = "notStarted";
} elseif (statuses[0]._id === "ended") {
completion.competitionStatus = "ended";
} else {
completion.competitionStatus = "playing";
} else {
completion.competitionStatus = "playing";
}
然后將其保存到資料庫:
await completion.save();
請記住,此偽代碼容易出現競爭條件 - 如果游戲在之間更改狀態aggregate(),save()您可能最終在完成檔案中處于陳舊狀態。如果需要,您可能需要添加額外的查詢以確保資料一致性。
更新
如果 agame可以大于 1 completion,那么使用 Mongoose 將非常低效。從 v4.2 開始,您可以使用$merge聚合階段在資料庫端進行所有計算,并更新匹配的檔案:
db.competition.aggregate([
{
$match: {
games: "id_of_the_game"
}
},
{
"$lookup": {
from: "games",
let: {
g: "$games"
},
pipeline: [
{
$match: {
$expr: {
$in: [
"$_id",
"$$g"
]
}
}
},
{
$group: {
_id: "$gameStatus"
}
}
],
"as": "statuses"
}
},
{
$set: {
competitionStatus: {
"$cond": {
"if": {
"$gt": [
{
"$size": "$statuses"
},
1
]
},
"then": {
_id: "playing"
},
"else": {
"$arrayElemAt": [
"$statuses",
0
]
}
}
}
}
},
{
"$project": {
competitionStatus: "$competitionStatus._id"
}
},
{
"$merge": {
"into": "competition"
}
}
])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/417230.html
標籤:
上一篇:MongoDB聚合管道:條件乘法
下一篇:聚合函式未顯示計數大于1的結果
