我有users(簡化的)檔案結構的MongoDB集合:
{
_id: ObjectId,
name: 'John Doe',
sportsList: [ // array of objects
{
name: 'football',
level: 1500,
levelHistory: [ // array of objects
{
from: 1450,
to: 1500,
date: Date
},
...
]
},
{
name: 'tennis',
level: 1400,
levelHistory: [ // array of objects
{
from: 1350,
to: 1400,
date: Date
},
...
]
},
]
}
我想更新sportsList具有name === 'tennis'這樣的元素:
- 推入一個新元素
levelHistory - 更新
level到目前為止,我已經設法levelHistory使用此查詢推送一個新元素:
await User.updateOne(
{
_id: userId,
sportsList: {
$elemMatch: { name: 'tennis' }
}
},
{
$push: {
'sportsList.$.levelHistory': {
date: Date,
from: 1400,
to: 1450
}
},
// how do I set 'level: 1450' in the same query?
// if I tried to use a $set: { 'sportsList.$.level': 1450 } mongoDB throws an error
}
)
uj5u.com熱心網友回復:
詢問
- 管道更新需要 MongoDB >= 4.2
- 在陣列上映射
- 如果名稱不是網球,則不要更改元素
- 否則將元素(嵌入式檔案)與具有新級別的檔案和新級別歷史(舊元素的連接,與新元素)合并
測驗代碼在這里
update(
{"_id": 1},
[{"$set":
{"sportsList":
{"$map":
{"input": "$sportsList",
"in":
{"$cond":
[{"$ne": ["$$this.name", "tennis"]}, "$$this",
{"$mergeObjects":
["$$this",
{"level": 1450,
"levelHistory":
{"$concatArrays":
["$$this.levelHistory",
[{"from": 1400, "to": 1450, "date": 4}]]}}]}]}}}}}])
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/359652.html
標籤:javascript 节点.js MongoDB 猫鼬
