Mongodb Обновление элементов из нескольких массивов в документе - PullRequest
0 голосов
/ 16 марта 2020

Я бы хотел обновить свойство из объектов, расположенных в нескольких списках в документе коллекции 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
        }
    ]
}

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

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

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

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

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

И эта команда eturns 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 })

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

Спасибо!

1 Ответ

2 голосов
/ 16 марта 2020

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

> 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 
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...