更新mongodb中选择数组元素的基础的嵌套数组元素

时间:2017-01-31 13:10:48

标签: arrays mongodb updating

以下是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" : "temp@gmail.com", 
                "email_type" : "Home", 
                "em_id" :1
            },
            {
                "email_id" : "test@gmail.com", 
                "email_type" : "work", 
                "em_id" :2
            }
        ], 
         "pb_name_prefix" : "MR."
    }
 ]
}`

我希望mongodb查询能够根据email_id更新pb_email_id数组中的em_id数据。如果我选择em_id=1,那么该记录temp@gmail.com将会更新。如果我选​​择em_id=2,则test@gmail.com将会更新。

1 个答案:

答案 0 :(得分:0)

我认为你不能在更新调用中应用if-else逻辑,你可以运行两个单独的更新调用

db.collection.update({'pb_email_id.em_id':1},{$set : {'pb_email_id.$.email_id' : 'temp@gmail.com'}},{multi:true});

db.collection.update({'pb_email_id.em_id':2},{$set : {'pb_email_id.$.email_id' : 'test@gmail.com'}},{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 = "temp@gmail.com"}
    else if(doc.pb_email_id[i].em_id === 2){doc.pb_email_id[i].email_id = "test@gmail.com"}
     db.collection.save(db)
     }
  }
 })

如果你必须应用多个逻辑,你可以运行脚本,否则两个更新调用,如果需要那么多。

P.S - 由于你没有提到集合名称,我使用db.collection.update它应该是集合名称,如db.phonebook.find等。