#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 }
]
})