僅當陣列尚未包含這樣的專案時,我才嘗試更新檔案中的嵌套陣列:
await userCollection.findOneAndUpdate(
{ _id: ObjectId('616acc597ebda90ca6ffee21') },
{
'devices': {
$push: {
$cond: {
if: {
$in: [req.body.serial, '$devices']
},
then: '$devices',
else: { serial: req.body.serial, data: [] }
}
}
}
},
{ returnOriginal: false },
(err, _) => {
if (err) {
return res.status(400);
} else {
return res.status(200).json(user.value);
}
}
);
這是我的用戶物件:
{
"_id": "616acc597ebda90ca6ffee21",
"username": "[email protected]",
"displayName": "Test",
"devices": [
{
"serial": "865674036421275",
"data": [
{
"timestamp": "2021-10-16T12:36:35.799Z"
},
{
"timestamp": "2021-10-16T12:41:33.633Z"
},
{
"timestamp": "2021-10-16T12:52:03.055Z"
}
]
},
],
"hashedPassword": "R5vt3vY7vEvTHvhC7YGNOWuIjBUQGLqsd92QGE06tjU=",
"salt": "6RS0OVIFboCkIEPHdZmTcQ==",
"dateCreated": "2021-10-16T12:58:00.294Z"
}
如何檢查串口是否已經在設備中?另外,如果錯誤已經存在,是否有可能拋出錯誤?
uj5u.com熱心網友回復:
詢問
- find 僅更新沒有此序列號的檔案
(使用eq/ne查詢運算子,我們可以執行 arrays=value,如果陣列的值為 true) - 替換為
"000"您要添加的序列號 - 推到底
- updateOne 將回傳結果,您可以查看更新是否完成,請參閱您的驅動程式方法詳細資訊。
*它會很快,你不需要索引,devices.serial
因為它選擇了一個已經_id匹配的特定檔案
測驗代碼在這里
db.collection.update({
"_id": ObjectId("616acc597ebda90ca6ffee21"),
"devices.serial": {
"$ne": "000"
}
},
{
"$push": {
"devices": {
"serial": "000",
"data": []
}
}
})
我們不能將更新運算子與聚合運算子混合使用。
$cond是聚合運算子,不能與$push更新運算子混合使用。(聚合$push用于組,不能添加到陣列中)
我們可以使用更新管道進行更新,但這里的普通更新更簡單。
uj5u.com熱心網友回復:
有一個名為addToSet
check it here的更新運算子
uj5u.com熱心網友回復:
MongoDB 原始查詢
db.userCollection.updateOne({
_id: ObjectId('616acc597ebda90ca6ffee21'), // Object Id, make sure It is Object Id only else match just string version
"devices.serial": {$ne: "SerialNeedToMatch" }
}, {
$push: {
"devices": {
serial: '111' // or complete object
}
}
})
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/326167.html
