Как сделать обновление во вложенных документах по пути свойства и массиву строк?

Я пытаюсь обновить/заменить один элемент из массива строк. Как я могу сделать это в монгодб?

Я пытался использовать версию mongodb >= 4, mongoose >= 5 и nodejs >= v12.2.0.

Это мое обновление:

{
          _id: bot._id,
          intents: {
            $elemMatch: {
              name: "car",
              examples: "blue",
            },
          },
        },
        {
          $set: { 'intents.$[outer].examples.$[inner]': "yellow" },
        },
        {
          arrayFilters: [
            { 'outer.name': "car" },
            { 'inner.examples': "blue" },
          ],
        },

Это единый документ:

{
        "_id" : ObjectId("5cff64bacea5f52b74cefd57"),
        "name" : "a",
        "language" : "en",
        "userId" : "auth0|5ce2ce9fb0ada80ea32d7643",
        "cloudBotId" : "4327a229-ec34-423e-b9ad-4778cf74b0a0",
        "intents" : [
                {
                        "examples" : [
                                "blue"
                        ],
                        "name" : "car"
                },
                {
                        "examples" : [
                                "red"
                        ],
                        "name" : "bike"
                }
        ],
        "__v" : 0
}

Я рассчитываю заменить «синий» на «желтый».

Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
0
32
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Вы были рядом... не нужно добавлять примеры в ваши arrayFilters, просто используйте inner :

        {
          _id: bot._id,
          intents: {
            $elemMatch: {
              name: "car",
              examples: "blue",
            },
          },
        },
        {
          $set: { 'intents.$[outer].examples.$[inner]': "yellow" },
        },
        {
          arrayFilters: [
            { 'outer.name': "car" },
            { 'inner': "blue" },
          ],
        }

Отлично, это работает. Поскольку у меня есть $elemMatch имя запроса «автомобиль», я удалил из $elemMatchexamples: "blue" и из arrayFilters также {"outer.name": "car"}, а для последнего я изменил $set на $set: { 'intents.$.examples.$[inner]': "yellow" } Как вы думаете, это хорошо?

Joao Silva 11.06.2019 14:36

Но я думаю, что у меня будет больше производительности с examples: "blue", потому что, если у меня есть какое-то намерение.name eq car и нет в примерах с blue, вероятно, я пропущу часть arrayFilter, выполняющую операции.

Joao Silva 11.06.2019 14:41

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