NodeJS 从嵌套数组mongodb中移除元素

n3h0vuf2  于 2023-04-29  发布在  Node.js
关注(0)|答案(3)|浏览(157)

我有下面的文档,它有两个数组,一个在另一个里面,
附件数组和附件数组内的文件数组。我想删除一个元素内的文件数组使用此element _id .但它不与我一起工作,我尝试了这段代码,它返回{ n:144,n修改:0,确定:1 }

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

        });

这就是文档的外观x1c 0d1x

kmbjn2e3

kmbjn2e31#

你可以尝试下面的更新查询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 } )

unhi4e5o

unhi4e5o2#

Mongodb 3之前的版本。****

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

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

i2byvkas3#

我遇到了同样的问题,得到了另一个解决方案:

const modelA = await Model.findOne(...)
modelA.array1[0].nestedArray[1] = 'test value'
await modelA.update(modelA.toObject())

相关问题