Обновление запроса mongodb выберите вложенные поля - PullRequest
2 голосов
/ 08 мая 2019

это мой документ на монго:

"calendar": {
        "_id": "5cd26a886458720f7a66a3b8",
        "hotel": "5cd02fe495be1a4f48150447",
        "calendar": [
            {
                "_id": "5cd26a886458720f7a66a413",
                "date": "1970-01-01T00:00:00.001Z",
                "rooms": [
                    {
                        "_id": "5cd26a886458720f7a66a415",
                        "room": "5cd17d82ca56fe43e24ae5d3",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    },
                    {
                        "_id": "5cd26a886458720f7a66a414",
                        "room": "5cd17db6ca56fe43e24ae5d4",
                        "price": "",
                        "remaining": 0,
                        "reserved": 0
                    }
                ]
            },
   }

Мне нужно обновить объекты в массиве комнат. Я попытался запрос, который выбирает соответствующий элемент без синтаксической ошибки, но приходит ошибка:

"errmsg": "Поле 'calendar.0.rooms.0.price' должно быть массивом, но имеет тип строки в документе {_id: ObjectId ( '5cd26a886458720f7a66a3b8')}»,

и это мой запрос:

db.calendars.updateOne({_id:ObjectId("5cd26a886458720f7a66a3b8"), 
 "calendar":{"$elemMatch":{"_id":ObjectId("5cd26a886458720f7a66a413"),"rooms._id":
 ObjectId("5cd26a886458720f7a66a415")}}}, 
{"$push":{"calendar.$[outer].rooms.$[inner].price":"100000"}}, {"arrayFilters":[{"outer._id":ObjectId("5cd26a886458720f7a66a413")},{"inner._id":ObjectId("5cd26a886458720f7a66a415")}]})

это ссылка, которую я нашел в StackOverflow, но не помог: Обновление вложенного массива с помощью MongoDB

1 Ответ

2 голосов
/ 08 мая 2019

Вы можете использовать запрос ниже

db.getCollection("test").updateOne(
  {
    "_id": ObjectId("5cd26a886458720f7a66a3b8"),
    "calendar.calendar": {
      "$elemMatch": {
        "_id": ObjectId("5cd26a886458720f7a66a413"),
        "rooms._id": ObjectId("5cd26a886458720f7a66a415")
      }
    }
  },
  { "$set": { "calendar.calendar.$[outer].rooms.$[inner].price": "100000" } },
  {
    "arrayFilters": [
      { "outer._id": ObjectId("5cd26a886458720f7a66a413") },
      { "inner._id": ObjectId("5cd26a886458720f7a66a415") }
    ]
  }
)

Я обновлю свой ответ с некоторыми объяснениями позже

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...