Я пытаюсь выполнить 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
.