0
假設我有一個結構爲;將2個查詢合併爲1個查詢
{
name: "",
surname: "",
id: 1,
children: [
{id: 2, name: "", age: ""},
{id: 3, name: "", age: ""}
]
}
我想根據情況添加新的子項或更新現有的子項。
要添加新的孩子到列表中,我寫了查詢是;
db.collection.update({id: 1}, {
$push: {
children: {
name: "alex",
age: 12,
id : shortid.generate()
}
}
}, {
upsert:true
},function(err, result) {
}
無論是插入還是更新,我都應該更新id爲1的文檔。所以我想將這兩種情況合併爲1個查詢。
如果我想添加孩子到兒童數組,我應該使用$推,否則,如果它是一個更新,我應該更新兒童對象的字段。所以通過使用$ cond我寫了一個像這樣的查詢;
db.collection.update({id: 1},
{
$cond : {
if: {id: {$exists: 21}} ,
then: {
$set: {
children: { name: "new name", age: "new age"}
}
},
else: {
$push: {
children: {
name: "alex",
age: 12,
id : 21
}
}
}
}, {
upsert:true
},function(err, result){}
而且我發現不可能有這樣的查詢,我得到了一個錯誤。這是不是太不現實?我應該分開採取這兩種情況嗎?我認爲這是一個好主意,因爲我更新了id:1的相同文檔,無論它是更新還是插入。唯一的變化是決定是否設置字段或創建並將它們推送到子數組中。你對這種情況有何建議?是的,我承認,我正嘗試用mongodb和$ cond獲得一些經驗。
不安:真意味着同樣的事情。如果文檔存在,只需更新它,否則用提供的值插入新文檔。像所有其他編程語言一樣,有定義的規則。給定的關鍵字或語句後可以添加什麼。 MongoDB也是如此。檢查文檔以查看'update'中是否支持$ cond? – Saleem
@saleem好的upsert做同樣的事情。但是,我只是推$。我沒有檢查任何條件。它是一個更新或不是,它只是推動新的價值觀的兒童對象。我錯了嗎?但是,我想要做的是編輯或推入一個查詢。 –
$ push是假設將項目推入數組而不管它是否存在。如果你想確保沒有推送重複項目,請參閱$ addToSet。 – Saleem