我有以下文档,它有两个数组,一个在另一个数组之内,
附件数组中的附件数组和文件数组。
我想使用此元素_id删除文件数组内的元素。但是它对我不起作用,我尝试了这段代码,它返回
{n:144,nModified:0,ok:1}
Invoice.update({}, {
$pull: {
"attachment":
{
"files":
{
$elemMatch:
{ _id: ObjectId("5b7937014b2a961d082de9bf") }
}
}
}
}, { multi: true })
.then(result => {
console.log("delete", result);
});
答案 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 } )
。