【问题标题】:Mongoose updating sub document array's individual element(document)Mongoose 更新子文档数组单个元素(文档)
【发布时间】:2015-12-22 10:11:11
【问题描述】:

组和成员的架构如下:

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

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我从您的问题详情中了解到,您希望根据您指定的标准更新 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 中直接实现。

    【讨论】:

      猜你喜欢
      • 2018-12-14
      • 2020-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-29
      • 2020-05-01
      • 2020-12-11
      相关资源
      最近更新 更多