Навигация по множеству массивов и обновление значения объекта с помощью запроса mongo

#arrays #mongodb

#массивы #mongodb

Вопрос:

Эй, ребята, я пытаюсь обновить значение, которое находится в массиве в MongoDB, пытаюсь использовать запросы mongo, но не работает, следую следующей документации из Mongo doc

это массив:

 {
    "_id" : "605e3d9b9ef219de662113d0",
    "distribution" : [ 
        {
            "floor" : 1,
            "rooms" : [ 
                {
                    "number" : 301,
                    "beds" : [ 
                        {
                            "number" : 818,
                            "status" : "Vacante Sucia"
                        }, 
                        {
                            "number" : 819,
                            "status" : "Vacante Sucia"
                        }
                    ],
                    "gender" : "M"
                }, 
                {
                    "number" : 302,
                    "beds" : [ 
                        {
                            "number" : 820,
                            "status" : "Vacante Sucia"
                        }, 
                        {
                            "number" : 821,
                            "status" : "Vacante Sucia"
                        }
                    ],
                    "gender" : "M"
                }, 
                {
                    "number" : 303,
                    "beds" : [ 
                        {
                            "number" : 822,
                            "status" : "Vacante Sucia"
                        }, 
                        {
                            "number" : 823,
                            "status" : "Vacante Sucia"
                        }
                    ],
                    "gender" : "M"
                }
            ]
        }
    ],
    "name" : "Meteorologia",
    "code" : "METEO"
}
 

это запрос, который используется в MongoDB для обновления статуса с кровати 801 , комнаты 301 , этажа 1 :

в arrayFilters я указал индекс 0 , чтобы получить первый элемент массивов

 db.getCollection('establishments_copy').findAndModify({query: { code: "METEO"}, update: { $set: { "distribution.$[i].rooms.$[i].beds.$[i].status": "TEST"}}, arrayFilters: [{"i.rooms": 0, "i.beds": 0, "i.status": 0}]})
 

они возвращают мне коллекцию, но без изменений, можно перемещаться по проверке не по индексу, а только по значениям.

например, используя следующий запрос:

 db.getCollection('establishments_copy').findAndModify({query: { code: 'METEO', distribution: { $elemMatch: { floor: 1, 'rooms.number': 301, 'rooms.beds.number': 818}}}, update: { $set: { '...': 'CHANGED'}}})
 

Спасибо!

Комментарии:

1. в вашей коллекции нет полей из rooms , beds , status со значением 0, если вы не знаете о arrayFilters в запросе обновления, пожалуйста, обратитесь docs.mongodb.com/manual/reference/operator/update /…

2. если вы пытаетесь обновить status поле во всех вложенных документах, попробуйте { $set: { "distribution.$[].rooms.$[].beds.$[].status": "TEST" } } , что условие фильтров массива не требуется.

3. этот запрос обновит весь статус внутри, я пробовал

4. можете ли вы объяснить, какой статус вы пытаетесь обновить?

5. Я изменил вопрос: кровать 818 из комнаты 301, этаж 1, код учреждения «МЕТЕО», первая в этом примере вопроса

Ответ №1:

Вам просто нужно создать отдельное условие в соответствии с именем поля вложенного документа,

  • f для floor поля в distribution массиве
  • r для number поля в rooms массиве
  • b для number поля в beds массиве
 db.getCollection('establishments_copy').findAndModify({
  query: { code: "METEO"}, 
  update: { 
    $set: { 
      "distribution.$[f].rooms.$[r].beds.$[b].status": "TEST"
    }
  }, 
  arrayFilters: [
    { "f.floor": 1 },
    { "r.number": 301 },
    { "b.number": 818 }
  ]
})
 

Игровая площадка