Mongoose更新子文档数组的单个元素(文档)

时间:2015-09-24 17:36:13

标签: node.js mongodb 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 
    }
  ]

}]

我的问题:

我正在尝试更新单个组成员的记录(子文档成员的元素)。在更新时,我有以下数据组:_idgroup_id,成员:_idnewdata。我这样想;但它无法正常工作

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);
          }
});

1 个答案:

答案 0 :(得分: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中直接实现。