Я обновляю документ коллекции mongo с помощью updateOne (). Я передаю filter, updatepart (оба типа BSON), опции update в качестве параметров для updateOne (). И коллекция, которую я создал программным образом, имеет ключ шарда (orderId).Однако первичным ключом для моей коллекции является составной ключ (orderId и lineNumber). Я могу вставить в свою коллекцию, но при обновлении документа (вставляя subobj, который имеет свой собственный ключ, внутри основного json), я получаю java.lang.IllegalArgumentException: Неверное имя поля BSON _id.orderId. Так что я подозреваю, что это может быть связано с конфигурацией ключа шарда.На самом деле, он не берет фильтр (фильтр имеет составные ключи), который я передаю в методе updateOne, и выдает неверную ошибку имени поля.Может ли кто-нибудь пролить свет на это. Я должен иметь возможность обновить документ с помощью subobj.
Я использую драйвер monogDb 3.2.2
Примечание: я уже пробовал использовать метод replaceOne вместоupdateOne, а также replaceOne Я не могу использовать, так как в моем случае мое обновление на самом деле представляет собой вставку subobj (массива) внутри основного json.
код создания коллекции осколков ``
BsonDocument cmd = new BsonDocument();
cmd.append("customAction", new BsonString("createCollection"))
.append("collection", new BsonString("collectionName"))
.append("shardKey", new BsonString("_id.orderId"))
.append("offerThroughput", new BsonInt32(Integer.parseInt("50000")))
;``
upsert part: (просто игнорируйте логику для updatePart, когда я соединяю ключ subobj) ``
Bson filter = Filters.eq("_id.orderId", orderId);
Bson filter1 = Filters.eq("_id.lineNumber", lineNumber);
Map<String, String> keyval = mapper.readValue(data, Map.class);
Entry<String, String> itr = keyval.entrySet().iterator().next();
String keyname = itr.getKey();
org.bson.Document newdoc = org.bson.Document.parse(mapper.writeValueAsString(itr.getValue()));
Bson finalfilter = Filters.and(filter,filter1);
Bson updatePart = combine(set(nodeName.concat(".").concat(keyname), newdoc));
UpdateResult result = dbccollection.updateOne( updatePart,finalfilter, new UpdateOptions().upsert(true));
``