Добавить и обновить значение дочерних массивов в Mongo db

Я хочу добавить значение в массив следующей структуры json в коллекции mongo db «Scdtls». Мне нужно добавить значение только там, где "Type": "Fees" и "IsCurrentVersion": true.

  {
    "_id": ObjectId("60e71243b484cf3ec22a6845"),
    "Item": "School",
    "Text": "School Details",
    "Types": [
      {
        "Type": "Library",
        "Values": [
          {
            "IsCurrentVersion": false,
            "KeyWords": [
              {
                "_id": ObjectId("611a4f113800d6af3fc4814f"),
                "Value": "Physics"
              }
            ]
          }
        ]
      },
      {
        "Type": "Fees",
        "Values": [
          {
            "IsCurrentVersion": false,
            "KeyWords": [
              {
                "_id": ObjectId("611a4f113800d6af3fc4814f"),
                "Value": "Admission"
              },
              {
                "_id": ObjectId("611a4f113800d6af3fc4814k"),
                "Value": "Canteen"
              }
            ]
          },
          {
            "IsCurrentVersion": true,
            "KeyWords": [
              {
                "_id": ObjectId("611a4f113800d6af3fc4814g"),
                "Value": "Tution"
              }
            ]
          }
        ]
      }
    ]
  }

Вот как я пытаюсь

db.Scdtls.update({
  "Item": "School",
  "Types.Type": "Fees",
  "Types.Values.IsCurrentVersion": true
},
{
  "$push": {
    "Types.1.Values.$[].KeyWords": {
      "_id": ObjectId(),
      "Value": "Sports"
    }
  }
})

Но это также добавляет "Value": "Sports" в "Type" : "Fees", где "IsCurrentVersion": false. Не в силах понять причину.

Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
0
21
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если я правильно понимаю, вы можете сделать нужное вам обновление с помощью "arrayFilters", вот так:

db.Scdtls.update({
  "Item": "School",
  "Types.Type": "Fees",
  "Types.Values.IsCurrentVersion": true
},
{
  "$push": {
    "Types.$[x].Values.$[y].KeyWords": {
      "_id": ObjectId("deadbeafcafebabec0deface"),
      "Value": "Sports"
    }
  }
},
{
  "arrayFilters": [
    { "x.Type": "Fees" },
    { "y.IsCurrentVersion": true }
  ]
})

Попробуйте на mongoplayground.net.

Другие вопросы по теме