使用 $pull 删除子文档项
Remove Subdocument items with $pull
我正在尝试使用 ExpressJS 和 Mongoose 从子文档中删除项目,但它只删除了第一个项目,而不是子项目。
所以我想删除消息数组中的 "subitem 2"
这是结构:
{
"_id" : ObjectId("5c4ee94b30ebd71cbed89a35"),
"title" : "Test",
"subitem" : [
{
"_id" : ObjectId("5c4ee95630ebd71cbed89a36"),
"title" : "Item 1",
"messages" : [
{
"_id" : ObjectId("5c4ee95f30ebd71cbed89a37"),
"type" : "single_article",
"date" : "Jan 28, 2019",
"title" : "subitem 1",
"text" : ""
}
]
},
{
"_id" : ObjectId("5c4ee96830ebd71cbed89a38"),
"title" : "item 2",
"messages" : [
{
"_id" : ObjectId("5c4ee96e30ebd71cbed89a39"),
"type" : "single_article",
"date" : "Jan 28, 2019",
"title" : "subitem 2",
"text" : ""
}
]
}
],
"__v" : 0
}
这是 $pull 方法:
getController.deleteRec = function(req,res,collection){
var id = req.params.id;
console.log(id);
collection.updateOne({'subitem.messages._id': id}, {$pull: {'subitem.0.messages': {"_id": id}}}).
then(function(result){
console.log(result);
});
};
现在我知道为什么只删除第一项了,因为我有 "subitem.0.messages"。我如何遍历它,以便它可以删除所有项目?
您可以使用 $
作为通配符索引,删除数组中与您的查询匹配的所有元素,如下所示:
{$pull: {'subitem.$.messages': {"_id": id}}}
如果要删除多个文档:
{$pull: {'subitem.$.messages': {"_id": {$in : [id, id2, id3...]}}}}
我正在尝试使用 ExpressJS 和 Mongoose 从子文档中删除项目,但它只删除了第一个项目,而不是子项目。
所以我想删除消息数组中的 "subitem 2" 这是结构:
{
"_id" : ObjectId("5c4ee94b30ebd71cbed89a35"),
"title" : "Test",
"subitem" : [
{
"_id" : ObjectId("5c4ee95630ebd71cbed89a36"),
"title" : "Item 1",
"messages" : [
{
"_id" : ObjectId("5c4ee95f30ebd71cbed89a37"),
"type" : "single_article",
"date" : "Jan 28, 2019",
"title" : "subitem 1",
"text" : ""
}
]
},
{
"_id" : ObjectId("5c4ee96830ebd71cbed89a38"),
"title" : "item 2",
"messages" : [
{
"_id" : ObjectId("5c4ee96e30ebd71cbed89a39"),
"type" : "single_article",
"date" : "Jan 28, 2019",
"title" : "subitem 2",
"text" : ""
}
]
}
],
"__v" : 0
}
这是 $pull 方法:
getController.deleteRec = function(req,res,collection){
var id = req.params.id;
console.log(id);
collection.updateOne({'subitem.messages._id': id}, {$pull: {'subitem.0.messages': {"_id": id}}}).
then(function(result){
console.log(result);
});
};
现在我知道为什么只删除第一项了,因为我有 "subitem.0.messages"。我如何遍历它,以便它可以删除所有项目?
您可以使用 $
作为通配符索引,删除数组中与您的查询匹配的所有元素,如下所示:
{$pull: {'subitem.$.messages': {"_id": id}}}
如果要删除多个文档:
{$pull: {'subitem.$.messages': {"_id": {$in : [id, id2, id3...]}}}}