У меня есть коллекция с ключом на полях _id и company. Таким образом, документ будет выглядеть так:
{
"_id": ObjectId("5e69a25624aa9a09d6a9e684"),
"company": "ABC",
"name": "Joe",
"address": "123 street"
},
{
"_id": ObjectId("5e69a25624aa9a09d6a9e683"),
"company": 4,
"name": "Fred",
"address": "123 street"
},
Некоторые поля компании имеют числовые значения c идентификаторы, а некоторые - строки. Я хочу написать запрос, подобный следующему: 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 Драйвер mon go, который заставляет меня использовать функцию findAndModify
.
Как я могу запросить коллекцию, используя $in
в поле компании? Когда я пишу запросы в командной строке, я вижу, что, если я использую updateMany
или updateOne
, все работает нормально, есть ли способ заставить драйвер java mon go использовать один из этих методов вместо findAndModify