Коллекция сегментированных запросов MongoDb с $ in - PullRequest
0 голосов
/ 17 марта 2020

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

1 Ответ

0 голосов
/ 17 марта 2020

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

metaDataCollection.updateMany(query, set, options);

на

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

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

...