Arhn - архитектура программирования

Элементы обновления MongoDB из нескольких массивов в документе

Я хочу обновить свойство объектов, расположенных в нескольких списках в документе коллекции MongoDB.

В коллекции MongoDB у меня есть такие документы:

{
    "firstArray": [
        {
        "name": "john",
        "updated": false // I wanna switch that to true
        },
        {
        "name": "bob",
        "updated": false
        }
    ],
    "secondArray": [
        {
        "name": "eric",
        "updated": false
        },
        {
        "name": "john",
        "updated": false // I wanna switch that to true
        }
    ]
}

Моя цель - обновить каждый элемент с помощью "name":"john" из свойств документа firstArray и secondArray до updated:true.

Поскольку они могут быть параллельными доступами к документу, я буду использовать только операторы обновления (метод чтения и замены подобный этому добавит риск удаления изменений, сделанных другим процессом)

Это выглядит как отфильтрованный позиционный оператор $[] как упомянутый в этом вопросе, является способом обновить свойство объекта из массива документа НО похоже, что он не поддерживает несколько $set с одним и тем же оператором и использование двух операторов (по одному массиву) в двух разных $set!

Поскольку эта команда оболочки mongo обновляет только secondArray:

    db['collection'].update(
    {},
    {
        "$set": { "firstArray.$[elem].updated": true },
        "$set": { "secondArray.$[elem].updated": true }
    },
    { "arrayFilters": [{ "elem.name": "john" }], "multi": true })

И эта команда возвращает The array filter for identifier 'a' was not used in the update { $set: { secondArray.$[b].updated: true } }:

    db['collection'].update(
    {},
    {
        "$set": { "firstArray.$[a].updated": true },
        "$set": { "secondArray.$[b].updated": true }
    },
    { "arrayFilters": [{ "a.name": "john" }, { "b.name": "john" }], "multi": true })

Итак, у вас есть идеи, как сделать это обновление? (Бонусный балл за любые цитаты из документации о вышеуказанных ограничениях)

Спасибо!

16.03.2020

Ответы:


1

Второй аргумент этой функции в объекте. Данное имя поля может иметь только одно значение в объекте. Чтобы показать, что отправляется на сервер, я присвоил используемое вами значение переменной:

> var o={    
     "$set": { "firstArray.$[a].updated": true },         
     "$set": { "secondArray.$[b].updated": true }     
}; 
> printjson(o)
{ "$set" : { "secondArray.$[b].updated" : true } }

Как видите, первое значение было перезаписано вторым, потому что оба поля были названы $set.

Попробуйте объединить их в одно поле:

{
  "$set": { 
           "firstArray.$[elem].updated": true,
            "secondArray.$[elem].updated": true 
  }
}
16.03.2020
  • Как я это пропустил? Большое спасибо, Джо! 16.03.2020
  • Думаю, я неправильно понял документ как в этом примере обновления упоминаются два разных $set (хотя и не без причины), но фактическая страница для оператора $set четко указать пример для обновления различных свойств за одно использование. 17.03.2020
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..