如何使用$ pull从嵌套数组pymongo的内部数组中删除元素

时间:2018-11-28 21:39:03

标签: mongodb pymongo

这是我的新闻文件结构

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中的元素。

2 个答案:

答案 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)