从嵌套数组mongodb中删除元素

时间:2018-08-19 09:41:32

标签: node.js mongodb mongoose mongodb-query

我有以下文档,它有两个数组,一个在另一个数组之内,
附件数组中的附件数组和文件数组。 我想使用此元素_id删除文件数组内的元素。但是它对我不起作用,我尝试了这段代码,它返回  {n:144,nModified:0,ok:1}

   Invoice.update({}, {
        $pull: {
            "attachment":
            {
                "files":
                {
                    $elemMatch:
                        { _id: ObjectId("5b7937014b2a961d082de9bf") }
                }
            }
        }
    }, { multi: true })
        .then(result => {
            console.log("delete", result);


        });

这是文档的外观 document

2 个答案:

答案 0 :(得分:1)

对于3.6之前的Mongodb版本

这里只有一个嵌套级别,因此您只需使用 $位置运算符即可。

Invoice.update(
  { "attachment.files._id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") },
  { "$pull": { "attachment.$.files": { "_id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") }}},
  { "multi": true }
)

对于Mongodb 3.6版及更高版本

如果要更新attachement数组中的多个元素,则可以使用$[]所有位置运算符。

const mongoose = require("mongoose")

Invoice.update(
  { "attachment.files._id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") },
  { "$pull": { "attachment.$[].files": { "_id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") }}},
  { "multi": true }
)

如果要更新attachment数组中的单个元素,则可以使用$[<identifier>]来标识与arrayFilters条件匹配的数组元素。

假设您只想更新attachment内具有_id等于ObjectId(5b7934f54b2a961d081de9ab)的元素

Invoice.update(
  { "attachment.files._id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") },
  { "$pull": { "attachment.$[item].files": { "_id": mongoose.Types.ObjectId("5b7937014b2a961d082de9bf") } } },
  { "arrayFilters": [{ "item._id": mongoose.Types.ObjectId("5b7934f54b2a961d081de9ab") }], "multi": true }
)

答案 1 :(得分:1)

您可以尝试在下面的3.6版本中更新查询。

Invoice.update( 
 {}, 
 {"$pull":{"attachment.$[].files":{_id:ObjectId("5b7969ac8fb15f3e5c8e844e")}}}, 
 {"multi": true}, function (err, result) {console.log(result);
});

如果要从旧版本升级,请使用db.adminCommand( { setFeatureCompatibilityVersion: 3.6 or 4.0 depending on your version } )