Обновление вложенных массивов в mongoDB через оболочку mongo
Ниже приводится документ MongoDB:
{
"_id" : 2,
"mem_id" : M002,
"email" : "xyz@gmail.com",
"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, language, genre и cast из-за вложенности. По сути, я хотел обновить все четыре упомянутых поля, а также поле подсчета для каждого и вложенных документов. Оператор обновления должен вставить значение в дерево, если оно новое, иначе следует увеличить счетчик для этого значения.
Какой может быть запрос в оболочке монго? Спасибо
2 ответа
Вы прямо попали в одно из текущих ограничений 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>}})
Давайте рассмотрим каждый случай:
Чтобы обновить имя поля в массиве 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 или язык по вашему выбору, а затем сохранить () то же самое. Я не думаю, что есть какой-либо другой доступный до Монго 2.4
Для дальнейшей документации вы можете обратиться к save ().
Спасибо!