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

Ниже приводится документ 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, language, genre и cast из-за гнездования. В принципе, я хотел обновить все четыре упомянутых поля вместе с полем отсчета для каждого и поддокументов. Оператор update должен вставлять значение в дерево, если значение new else должно увеличивать счетчик для этого значения.
Каким может быть запрос в оболочке mongo? благодаря

Вы прямо нажимаете одно из текущих ограничений 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":}}) db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":}}) 

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

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

Давайте рассмотрим случайный случай:

  1. Чтобы обновить имя поля в массиве 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 или язык по вашему выбору, а затем сохранить () то же самое. Я не думаю, что есть другой способ, ansible до mongo 2.4

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

Благодаря!

  • MongoDB на Android
  • mongodb найти несколько элементов массива
  • Округление до 2 десятичных знаков с использованием агрегационной структуры MongoDB
  • (MongoDB Java) $ push в массив
  • MongoDB: вспомогательный субподряд
  • Ошибка ECONNREFUSED при подключении к mongodb от node.js
  • Изменение каталога хранилища данных MongoDB
  • Необязательные параметры поискового запроса Mongoose?
  • mongodb.conf bind_ip = 127.0.0.1 не работает, но 0.0.0.0 работает
  • Умножить поле по значению в Mongodb
  • Хранить изображения в базе данных MongoDB
  • Давайте будем гением компьютера.