2015-09-24 3 views
0

Схемы группы и члена, как показано ниже:Mongoose обновления суб ДОКУМЕНТА массива (документ)

var group=new Schema({ 
    group_id:Number, 
    group_name:String, 
    members:[member] 
}); 

var member=new Schema({ 
    member_id:number, 
    name:String, 
}); 

Образец документа после вставки некоторых записей в коллекции группы

[{ 
    _id:55ff7fca8d3f6607114dc57d 
    group_id:1001, 
    group_name:"tango mike", 
    members:[ 
    { 
     _id:44ff7fca8d3f6607114dc21c 
     member_id:2001, 
     member_name:"Bob martin" , 
     address:String, 
     sex:String 
    }, 

    { 
     _id:22ff7fca8d3f6607114dc22d 
     member_id:2002, 
     member_name:"Marry", 
     address:String, 
     sex:String 
    }, 

    { 
     _id:44ff7fca8d3f6607114dc23e 
     member_id:2003, 
     member_name:"Alice" , 
     address:String, 
     sex:String 
    } 
    ] 

}] 

Моей проблема:

Я пытаюсь обновить запись отдельного члена группы (элемент элементов поддокумента). Во время обновления у меня есть следующая группа данных: _id, group_id, члены: _id и newdata. Я так стараюсь; но он не работает

var newData={ 
     member_name:"Alice goda" , 
     address:"xyz", 
     sex:"F" 
    } 

groupModel.findOne({"_id":"55fdbaa7457aa1b9bd7f7cf7","group_id":1001},'members -_id',function(err,groupMembers){ 
      if(err) 
      { 
       res.json({ 
        "isError":true, 
        "error":{ 
         "status":1042, 
         "message":err 
        } 
       }); 
      } 
      else 
      { 
       var mem=groupMembers.id("44ff7fca8d3f6607114dc23e"); 
       mem.member_name=newData.member_name; 
       mem.address=newData.address; 
       mem.sex=newData.sex; 

       mem.save(function(err,data){ 
        if(!err) 
        //sucessfull updated 
       }); 
       res.json(groupDetails); 
      } 
}); 

ответ

0

Как я понял из ваших деталей вопроса, вы хотите обновить один объект из members массива, в соответствии с критериями, которые вы укажете.

Таким образом, для того, чтобы точно выполнить запрос обновления для вашего случая использования, вы можете выполнить следующую операцию обновления с вашей коллекции:

db.collection.update({ _id: "55ff7fca8d3f6607114dc57d", 
         group_id:1001, 
         members: { 
          $elemMatch: { _id: "44ff7fca8d3f6607114dc23e" } 
         } 
         }, 

         { $set: { 

         "members.$.member_name": "Alice goda", 
         "members.$.address": "xyz", 
         "members.$.sex": "F" 

         }}); 

Тем не менее, следует помнить, что позиционная оператор $ только обновляет первый элемент массива, соответствующий вашему запросу.

К сожалению, нет возможности обновлять все элементы массива, соответствующие вашим критериям за одну операцию. Как вы можете видеть на MongoDB Jira, вышеупомянутая функция является одной из наиболее востребованных функций, но она еще не реализована непосредственно в MongoDB.