猫鼬嵌套子文档更新和删除

Posted

技术标签:

【中文标题】猫鼬嵌套子文档更新和删除【英文标题】:moongose nested subdocument update and delete 【发布时间】:2016-11-09 07:56:33 【问题描述】:
"_id": 
    "$oid": "577cc50d10b5a6c42b26f414"
, 
"firstName": "new",
"lastName": "new", 
"__v": 0,
"A": [
    
        "AfirstName": "AfirstName",
        "AlastName": "AlastName", 
        "_id": 
            "$oid": "577dbef2f2c9f5901f402efe"
        ,
        "AB": [
            
                "AB1firstName": "AB1firstName",
                "AB1lastName": "AB1lastName", 
                "_id": 
                    "$oid": "577dd3b1495663ec2a6ca456"
                
            ,
            
                "AB2firstName": "AB2firstName",
                "AB2lastName": "AB2lastName", 
                "_id": 
                    "$oid": "577dd3bc495663ec2a6ca45a"
                
            
        ]
    

] 
  Example.update(  _id: ,  A._id: , A.AB._id:   ,
"$set": "A.$.AB": data,
function(err,model) console.log(model); if (err) throw err;  )

这只会更新 AB 的第一个数据,我想通过 _id 更新 AB 子文档的数据,并且还想删除带有 _id 的特定嵌套子文档

【问题讨论】:

【参考方案1】:
 Example.findById(_id,function(err,doc)
                            var result = doc.A.id(AId).AB.id(AB.ABId);
                            result.AB1firstName="first Name";
                            result.AB1lastName=  "Last Name"; 
                            doc.save(); 
                         );

这将更新

【讨论】:

【参考方案2】:

每个文档都有一个_id。 DocumentArrays 有一个特殊的 id 方法,用于通过 _id 查找文档。

Example.findOne(  _id: id,  A._id: Aid, A.AB._id:  ABid,
            function(err,model) 
             if (err) throw err;
             var ABDoc  model.A.id(Aid).AB.id(ABid);
              ABDoc.AB2firstName="new value";
              ABDoc.AB2lastName="new value";
               model.save();
        )

【讨论】:

以上是关于猫鼬嵌套子文档更新和删除的主要内容,如果未能解决你的问题,请参考以下文章

如何使用嵌套子文档制作数组的猫鼬模式

使用 arrayFilters 更新 MongoDB 中的嵌套子文档

创建使用猫鼬更新和保存文档的方法?

猫鼬子文档数组更新[重复]

验证多个猫鼬文档并更新

猫鼬查找并保存不更新文档