Обновление вложенных массивов в mongoDB через оболочку mongo

Ниже приведен документ MongoDB:

{
    "_id" : 2,
    "mem_id" : M002,
    "email" : "[email protected]",
    "event_type" : [ 
        {
            "name" : "MT",
            "count" : 1,
            "language" : [ 
                {
                    "name" : "English",
                    "count" : 1,
                    "genre" : [ 
                        {
                            "name" : "Action",
                            "count" : 6
                        }, 
                        {
                            "name" : "Sci-Fi",
                            "count" : 3
                        }
                    ],
                    "cast" : [ 
                        {
                            "name" : "Sam Wortington",
                            "count" : 2
                        }, 
                        {
                            "name" : "Bruce Willis",
                            "count" : 4
                        }, 
                        {
                            "name" : "Will Smith",
                            "count" : 7
                        }, 
                        {
                            "name" : "Irfan Khan",
                            "count" : 1
                        }
                    ]
                }
            ]
        }
    ]
}

Я не могу обновлять поля с массивом типов, особенно event_type, язык, жанр и литые из-за вложенности. В принципе, я хотел обновить все четыре упомянутых поля вместе с полем отсчета для каждого и поддокументов. Оператор update должен вставлять значение в дерево, если значение new else должно увеличивать счетчик для этого значения.
Каким может быть запрос в оболочке mongo? Благодаря

Ответы

Ответ 1

Вы непосредственно нажимаете одно из текущих ограничений MongoDB. Проблема в том, что двигатель не поддерживает несколько позиционных операторов. См. Многократное использование позиционного оператора` $`для обновления вложенных массивов

Для этого есть открытый билет: https://jira.mongodb.org/browse/SERVER-831 (упоминается также там)

Вы также можете прочитать это о том, как изменить свою модель данных: Обновление вложенных массивов в mongodb

Если это возможно для вас, вы можете сделать:

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.0.language.$.count":<number>}})

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":<number>}})

Но вы не можете сделать:

db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":<number>}})

Ответ 2

Пусть в каждом случае:

  • Чтобы обновить имя поля в массиве event_type:

    db.testnested.update({ "event_type.name": "MT" }, {$ set: { "event_type.name": "GMT" }})

Эта команда будет обновлять имя для объекта внутри списка event_type, GMT по MT: ​​

BEFORE:
db.testnested.find({}, {"event_type.name" : 1})
{ "_id" : 2, "event_type" : [ { "name" : "MT" } ] }
AFTER:
db.testnested.find({}, {"event_type.name" : 1})
{ "_id" : 2, "event_type" : [ { "name" : "GMT" } ] }

2.Чтобы обновить поля внутри event_type, такие как язык, жанр, являющийся промежуточным списком: Для этого нет прямого запроса. Вам необходимо прочитать документ, обновить этот документ, используя JavaScript или язык по вашему выбору, а затем сохранить() то же самое. Я не думаю, что есть другой способ, доступный до mongo 2.4

Для дальнейшей документации вы можете обратиться к save().

Спасибо!