2017-01-31 222 views
0

以下是MongoDB文件。更新mongodb中選擇數組元素的基礎嵌套數組元素

`{ 
"_id" : ObjectId("588f09c8d466d7054114b456"), 
"phonebook" : [ 
    { 
     "pb_name_first" : "Aasu bhai", 
     "pb_phone_number" : [ 
      { 
       "ph_id" : 2, 
       "ph_no" : "+91111111", 
       "ph_type" : "Mobile" 
      } 
     ], 
     "pb_email_id" : [ 
      { 
       "email_id" : "[email protected]", 
       "email_type" : "Home", 
       "em_id" :1 
      }, 
      { 
       "email_id" : "[email protected]", 
       "email_type" : "work", 
       "em_id" :2 
      } 
     ], 
     "pb_name_prefix" : "MR." 
    } 
] 
}` 

我想MongoDB的查詢,將在pb_email_id陣列上的em_id基礎上更新email_id數據。如果我選擇em_id=1那麼該記錄[email protected]將更新。如果我選​​擇em_id=2,則[email protected]將更新。

回答

0

我不認爲你可以在更新調用應用的if-else邏輯,你可以運行兩個單獨的更新要求

db.collection.update({'pb_email_id.em_id':1},{$set : {'pb_email_id.$.email_id' : '[email protected]'}},{multi:true}); 

db.collection.update({'pb_email_id.em_id':2},{$set : {'pb_email_id.$.email_id' : '[email protected]'}},{multi:true}); 

但是你可以收集運行一個腳本來將多個邏輯

db.collection.find({}).forEach(function(doc){ 
if(doc.pb_email_id && doc.pb_email_id.length>0){ 
    for(var i in doc.pb_email_id){ 
    if(doc.pb_email_id[i].em_id === 1){ 
     doc.pb_email_id[i].email_id = "[email protected]"} 
    else if(doc.pb_email_id[i].em_id === 2){doc.pb_email_id[i].email_id = "[email protected]"} 
    db.collection.save(db) 
    } 
    } 
}) 

如果你必須應用多個邏輯,你可以運行腳本,否則兩個更新的調用,如果這是多少需要。

P.S - 因爲你沒有提到的集合名稱,我用db.collection.update應該是集合名稱,如db.phonebook.find