У меня есть сегментированная коллекция с ключом сегмента в полях _id и company. Таким образом, документ будет выглядеть так:
{
"_id": ObjectId("5e69a25624aa9a09d6a9e684"),
"company": "ABC",
"name": "Joe",
"address": "123 street"
},
{
"_id": ObjectId("5e69a25624aa9a09d6a9e683"),
"company": 4,
"name": "Fred",
"address": "123 street"
},
Некоторые поля компании представляют собой числовые идентификаторы, а некоторые — строки. Я хочу написать такой запрос: db.people.findAndModify({"query": {"_id": ObjectId("5e69a25624aa9a09d6a9e684"), "company": {"$in": ["ABC", "4", 4]}}, "update": {"$set": {"address": "433 street"}}})
Причина, по которой некоторые из них являются строками, а некоторые — числами, заключается в том, что устаревший формат идентификатора компании был числом, но с недавними изменениями он также может быть строкой. Кроме того, во время запроса я не знаю, какой формат мне нужно использовать.
Приведенный выше запрос завершается с ошибкой, подобной этой
QUERY [js] uncaught exception: Error: findAndModifyFailed failed: {
"ok" : 0,
"errmsg" : "Query for sharded findAndModify must contain the shard key",
"code" : 61,
"codeName" : "ShardKeyNotFound",
"$clusterTime" : {
"clusterTime" : Timestamp(1584461817, 1),
"signature" : {
"hash" : BinData(0,"ud27faacC2Jn3bYt1w0MNMr2MD0="),
"keyId" : NumberLong("6785743810203746305")
}
},
"operationTime" : Timestamp(1584461817, 1)
}
Я использую драйвер java mongo, который заставляет меня использовать функцию findAndModify
.
Как я могу запросить коллекцию, используя $in
в поле компании? Когда я пишу запросы в командной строке, я вижу, что если я использую updateMany
или updateOne
, все работает нормально, есть ли способ заставить драйвер java mongo использовать один из этих методов вместо findAndModify
?