Непоследовательные результаты запроса при выполнении upserts в изолированной коллекции MongoDB, в зависимости от формата запроса - PullRequest
0 голосов
/ 27 марта 2020

Я пытаюсь выполнить upserts для кластера mongoDB в изолированной коллекции с именем EventPriceUpdated. Коллекция имеет следующие индексы:

mongos> db.getCollection('EventPriceUpdated').getIndexes()
[
    {
        "v" : 2,
        "key" : {
            "_id" : 1
        },
        "name" : "_id_",
        "ns" : "internal.EventPriceUpdated"
    },
    {
        "v" : 2,
        "key" : {
            "eventId" : "hashed"
        },
        "name" : "eventId_hashed",
        "ns" : "internal.EventPriceUpdated"
    }
]

и обрабатывается eventId.

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

db.getCollection('EventPriceUpdated').update(
         { _id: ObjectId('5e7b94cec7b614079f6bc8be') },
         { eventId: 1006232830, 
           price: 123,
           _id: ObjectId('5e7b94cec7b614079f6bc8be'),
         },
         {
            upsert: true,
            multi: false
         }
   )

Я получаю результат Updated 1 new record(s) in 61ms, что я и ожидаю.

Однако , когда я пытаюсь выполнить тот же запрос *1016*, используя немного другой форматирование (т.е. с оператором $set):

db.getCollection('EventPriceUpdated').update(
         { _id: ObjectId('5e7b94cec7b614079f6bc8b2') },
         {
            $set: {
                eventId: 1006232830, 
                price: 123,
                _id: ObjectId('5e7b94cec7b614079f6bc8b2')
                }
         },
         {
            upsert: true,
            multi: false
         }
   )

Я получаю следующую ошибку:

An upsert on a sharded collection must contain the shard key and have the simple collation. Update request: { q: { _id: ObjectId('5e7b94cec7b614079f6bc8b2') }, u: { $set: { eventId: 1006232830.0, price: 123.0, _id: ObjectId('5e7b94cec7b614079f6bc8b2') } }, multi: false, upsert: true }, shard key pattern: { eventId: "hashed" }

Я не понимаю, почему это происходит. В соответствии с документацией MongoDB о эксплуатационных ограничениях в сегментированных кластерах :

Все операции updateOne (), removeOne () и deleteOne () для сегментированной коллекции, которые указывают multi: Параметр false или justOne должен включать ключ шарда или поле _id в спецификации запроса

Для одного я считаю это утверждение неоднозначным, поскольку оно не говорит явно, что оно ссылается на часть query запрос на обновление , для которого требуется либо _ id, либо ключ шарда.

Кроме того, я предполагаю, что это ограничение также относится к update. Я не могу найти документацию по указанию параметра multi в updateOne, но он упоминается в документации по update.

...