Mongodb: загружать несколько документов одновременно (с ключом, например, $ in) - PullRequest
0 голосов
/ 20 сентября 2018

Я наткнулся на забавное поведение в MongoDB:

Когда я запускаю:

db.getCollection("words").update({ word: { $in: ["nico11"] } }, { $inc: { nbHits: 1 } }, { multi: 1, upsert: 1 })

, он создаст "nico11", если он не существует,и увеличьте nbHits на 1 (как и ожидалось).

Однако при запуске:

db.getCollection("words").update({ word: { $in: ["nico10", "nico11", "nico12"] } }, { $inc: { nbHits: 1 } }, { multi: 1, upsert: 1 })

он будет корректно обновлять ключи, которые уже находятся в БД, , но не вставлятьнедостающие .

Это ожидаемое поведение, и есть ли способ, которым я могу предоставить массив для mongoDB, чтобы он обновлял существующие элементы и создавал те, которые должны быть созданы?

1 Ответ

0 голосов
/ 20 сентября 2018

Это ожидаемое поведение в соответствии с документацией :

Обновление создает базовый документ из предложений равенства в параметре, а затем применяет выражения обновления из параметра,Операции сравнения из этого не будут включены в новый документ.

И, нет, нет способа достичь того, что вы пытаетесь сделать, используя простой переход.Причиной этого, вероятно, является то, что ожидаемый результат будет невозможно определить.В вашем конкретном случае можно было бы спорить в духе: «да ладно, довольно очевидно, что мы должны здесь делать».Но представьте себе более сложный запрос, подобный следующему:

db.getCollection("words").update({
    a: { $in: ["b", "c" ] },
    x: { $in: [ "y", "z" ]}
},
{ $inc: { nbHits: 1 } },
{ multi: 1, upsert: 1 })

Что должен делать MongoDB в этом случае?

Однако существует концепция операций массовой записи вMongoDB, где вам нужно определить три отдельные операции updateOne и упаковать их в один запрос к серверу.

...