MongoDb запрашивает сегментированную коллекцию с помощью $in

У меня есть сегментированная коллекция с ключом сегмента в полях _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?


person Hardy    schedule 17.03.2020    source источник


Ответы (1)


После публикации этого я еще немного поиграл и обнаружил, что могу изменить свой код Java с

metaDataCollection.updateMany(query, set, options);

to

metaDataCollection.bulkWrite(Arrays.asList(new UpdateManyModel<>(query, set, options)));

Что, похоже, решило проблему.

person Hardy    schedule 17.03.2020