这是我的新闻文件结构
if
我尝试过的查询如下
方法1
{
"_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"
}
]
}
]}
方法2
db.news.find_and_modify({},{'$pull': {"mediaset_list": {"medias": {"$elemMatch" : {"_id": ObjectId('5bfeff83bd9a221229c7c9ac')}} }}})
我们面临的问题
以上查询正在删除'mediaset_list'中的整个元素。但我只想删除“媒体”匹配对象ID中的元素。
答案 0 :(得分:1)
由于有两个嵌套数组,因此必须使用arrayFilters来指示应修改外部数组的哪个元素,请尝试:
db.news.update({ _id: ObjectId("5bff0903bd9a221229c7c9b2") },
{ $pull: { "mediaset_list.$[item].medias": { _id: ObjectId("5bfeff83bd9a221229c7c9ad") } } },
{ arrayFilters: [ { "item._id": ObjectId("5bfeff94bd9a221229c7c9ae") } ] })
因此,item
在这里用作占位符,MongoDB将使用它来确定mediaset_list
的哪个元素需要修改,并且该占位符的条件在arrayFilters
中定义。然后,您可以使用$pull并为内部数组指定另一个条件,以确定应该删除哪个元素。
答案 1 :(得分:1)
来自@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)