mongoDB $ set проблема с использованием значения ключа документа / значения другого поля - PullRequest
1 голос
/ 18 июня 2020

У меня проблема с обновлением и установка в mongoDB. (Версия оболочки MongoDB v4.2.6) У меня есть коллекция, содержащая такие документы, как:

      {
        "_id": ObjectId("5ec6b069a8640000b1002012"),
        "name": "MS WINDOWS DSP 10 HOME 32-BIT ENG",
        "brand": "MICROSOFT",
        "date_added": NumberInt("1590079220"),
        "supplier": {
            "name": "dsfgdft",
            "product_id": "00-01-901-091"
        },
    ...
}

Когда я пытаюсь добавить новое поле ко всем документы в коллекции с помощью следующей команды:

db.products.update({},{$set:{search_stems:"$name"}},{multi:true})

Документы не получают значение $name для ключа search_stems, он просто добавляет $ name как значение search_stems

     {
        "_id": ObjectId("5ec6b069a8640000b1002012"),
        "name": "MS WINDOWS DSP 10 HOME 32-BIT ENG",
        "brand": "MICROSOFT",
        "date_added": NumberInt("1590079220"),
        "supplier": {
            "name": "dsfgdft",
            "product_id": "00-01-901-091"
        },
    ...
"search_stem":"$name"
}

что я делаю не так?

Я прочитал следующее

Обновить поле MongoDB, используя значение другого поля

, но оно не получает прямое значение поля из документа они используют $ concat после $ set

1 Ответ

1 голос
/ 18 июня 2020

Попробуйте запрос ниже, который использует конвейер агрегации в .updateMany () :

db.products.updateMany({},[ { $set: { search_stems : "$name" } } ])

При агрегировании мы можем ссылаться на поле, используя $, поэтому мы обертываем ваш операция обновления в массиве [], чтобы сказать, что это конвейер агрегации. Используя оператор $set, который является псевдонимом для $addFields в агрегации, мы можем установить значение поля search_stems, взятое из поля name.

Агрегация обновлений введена с 4.2, до этого, если вы делаете search_stems:"$name", это означает, что вы присваиваете строковое значение $name полю с именем search_stems. В качестве примечания вам не нужно использовать параметр {multi:true} с .update(), вместо этого используйте .updateMany().

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