2016-04-25 161 views
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獲得一些經驗。

+0

不安:真意味着同樣的事情。如果文檔存在,只需更新它,否則用提供的值插入新文檔。像所有其他編程語言一樣,有定義的規則。給定的關鍵字或語句後可以添加什麼。 MongoDB也是如此。檢查文檔以查看'update'中是否支持$ cond? – Saleem

+0

@saleem好的upsert做同樣的事情。但是,我只是推$。我沒有檢查任何條件。它是一個更新或不是,它只是推動新的價值觀的兒童對象。我錯了嗎?但是,我想要做的是編輯或推入一個查詢。 –

+0

$ push是假設將項目推入數組而不管它是否存在。如果你想確保沒有推送重複項目,請參閱$ addToSet。 – Saleem

回答

0

你的第一個解決方案是正確的,做你想做的事情。 upsert選項告訴mongo檢查文檔是否存在。然後,Mongo將插入文檔,如果它不存在或更新現有的文檔與新的價值它是一個文檔與給定的ID存在。你不需要做任何事情。