Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 如何使用$pull从嵌套数组pymongo的内部数组中删除元素_Mongodb_Pymongo - Fatal编程技术网

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语法,但它可以工作。谢谢