Mongodb 如何使用$pull从嵌套数组pymongo的内部数组中删除元素
这是我的新闻文档结构Mongodb 如何使用$pull从嵌套数组pymongo的内部数组中删除元素,mongodb,pymongo,Mongodb,Pymongo,这是我的新闻文档结构 { "_id" : ObjectId("5bff0903bd9a221229c7c9b2"), "title" : "Test Page", "desc" : "efdfr", "mediaset_list" : [ { "_id" : ObjectId("5bfeff94bd9a221229c7c9ae"), "medias" : [ { "_id" : ObjectId(
{
"_id" : ObjectId("5bff0903bd9a221229c7c9b2"),
"title" : "Test Page",
"desc" : "efdfr",
"mediaset_list" : [
{
"_id" : ObjectId("5bfeff94bd9a221229c7c9ae"),
"medias" : [
{
"_id" : ObjectId("5bfeff83bd9a221229c7c9ac"),
"file_type" : "png",
"file" : "https://aws.com/gg.jpg",
"file_name" : "edf.jpg"
},
{
"_id" : ObjectId("5bfeff83bd9a221229c7c9ad"),
"file_type" : "mov",
"file" : "https://aws.com/gg.mov",
"file_name" : "abcd.mov"
}
]
}
]}
下面给出了我尝试过的查询
方法1
db.news.find_and_modify({},{'$pull': {"mediaset_list": {"medias": {"$elemMatch" : {"_id": ObjectId('5bfeff83bd9a221229c7c9ac')}} }}})
方法2
db.news.update({},{'$pull': {"mediaset_list.$.medias": {"_id": ObjectId('5bfeff83bd9a221229c7c9ac')}} })
我们面临的问题
上述查询正在删除“mediaset_列表”中的整个元素。但我只想删除与对象ID匹配的“media”中的元素。由于您有两个嵌套数组,必须使用它们来指示应修改外部数组的哪个元素,请尝试:
db.news.update({ _id: ObjectId("5bff0903bd9a221229c7c9b2") },
{ $pull: { "mediaset_list.$[item].medias": { _id: ObjectId("5bfeff83bd9a221229c7c9ad") } } },
{ arrayFilters: [ { "item._id": ObjectId("5bfeff94bd9a221229c7c9ae") } ] })
因此,
item
在此用作占位符,MongoDB将使用该占位符确定需要修改mediaset\u列表的哪个元素,并且该占位符的条件在arrayFilters
中定义。然后,您可以使用并指定内部数组的另一个条件来确定应删除哪个元素。从@micki的mongo shell查询(上面的答案)中,这是pymongo语法,它将使用该媒体id更新所有新闻文档
db.news.update_many({},
{
"$pull":
{ "mediaset_list.$[item].medias": { "_id": ObjectId("5bfeff83bd9a221229c7c9ad") } } ,
},
array_filters=[{ "item._id": ObjectId("5bfeff94bd9a221229c7c9ae")}],
upsert=True)
@米奇。这不是pymongo语法,但它可以工作。谢谢