Как удалить элемент из внутреннего массива pymongo вложенного массива, используя $ pull - PullRequest
0 голосов
/ 29 ноября 2018

Вот моя структура документа новостей

{
"_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_list'.Но я хочу только удалить элемент внутри идентификатора объекта 'medias'.

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

Из запроса оболочки mongo @ micki (ответ выше): это синтаксис pymongo, который обновит весь новостной документ с таким идентификатором носителя.

db.news.update_many({}, 
    { 

    "$pull": 

        { "mediaset_list.$[item].medias": { "_id": ObjectId("5bfeff83bd9a221229c7c9ad") } } ,
     },
     array_filters=[{ "item._id": ObjectId("5bfeff94bd9a221229c7c9ae")}],

     upsert=True)
0 голосов
/ 29 ноября 2018

Поскольку у вас есть два вложенных массива, вы должны использовать 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 и указать другое условие для внутреннего массива, чтобы определить, какой элемент должен быть удален.

...