我有這個架構:
...
recommended:{
type:[{
movieId:String,
recommendedBy:[String]
}],
default:[],
},
name: {
type: String,
}
從我得到的請求movieId和id. recommended如果已經沒有其他相同的專案,我想將一個新物件添加到陣列movieId中,并在這兩種情況下都將其添加id到recommendedBy嵌套陣列中。
到目前為止,我有這個:
const user = User.findByIdAndUpdate({_id:'123'},
{$AddToSet:{'recommended.$[movie].recommendedBy':id}},
{arrayFilters:[{'movie.movieId':movieId}]})
這只會將recommendedBy已經存在的專案設定為具有相同的movieId,但不會推送具有新movieId屬性的新物件。(所以這兩個陣列基本上都是 $AddToSet )我怎么能做到這一點?謝謝!
uj5u.com熱心網友回復:
也許您需要像這樣簡單的東西來為推薦的陣列元素執行 upsert 或更新:
db.collection.update({},
[
{
$set: {
recommended: {
"$reduce": {
"input": "$recommended",
"initialValue": // assign your edit data as init value
[
{
"movieId": "1",
"recommendedBy": "who recommended"
}
],
"in": {
"$cond": {
"if": {
$in: [
"$$this.movieId",
"$$value.movieId"
]
},
"then": "$$value",
"else": {
"$concatArrays": [
"$$value",
[
"$$this"
]
]
}
}
}
}
}
}
}
])
解釋:
- 沒有過濾器,但您可以在初始檔案過濾器中添加任何內容以僅搜索有限的檔案集。
- 在更新階段,您使用 $reduce 檢查您需要更新插入或更新受影響陣列元素中的值的輸入陣列元素。
(確認在 mongod 4.4 中作業)
操場
uj5u.com熱心網友回復:
我無法理解@R2D2 的回答,所以我想出了這個解決方法,它對我來說出乎意料地好,因為我還需要能夠洗掉它movieId以及所有recommendedBy它。
我將架構更改為:
recommanded:{
type: Map,
of:[String],
default:{}
},
我正在洗掉/添加:
User.findByIdAndUpdate({_id:"123",{$addToSet:{[`recommended.${movieId}`]:id}})
和
User.findByIdAndUpdate({_id:"123",{$unset:{[`recommended.${movieId}`]:""}})
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/413822.html
標籤:
