2017-01-31 2 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 запрос, который будет обновлять данные в email_idpb_email_id массива на основе em_id. Если я выберу em_id=1, то эта запись [email protected] будет обновлена. Если я выберу em_id=2, то [email protected] будет обновляться.

ответ

0

Я не думаю, что вы можете применить, если-нибудь логику вызова обновления, вы можете запустить две отдельные обновления вызывает

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 и т.д.

Смежные вопросы