У меня есть следующий документ в коллекции MongoDb, называемый hosts
{ "_id" : ObjectId("532aeec040a83df82181ff3c"),
"os" : "WINDOWS",
"name" : "Host 1",
"bas" : [
{ "wwn" : "EE:00:11:FF", "id" : "1" },
{ "wwn" : "AA:00:11:BB", "id" : "2" } ]
}
Теперь я хочу обновить ba
id=1
в Host name=Host 1
до { "wwn": "AA:BB:CC:DD", "id": "11" }
. После обновления результат будет
{ "_id" : ObjectId("532aeec040a83df82181ff3c"),
"os" : "WINDOWS",
"name" : "Host 1",
"bas" : [
{ "wwn" : "AA:BB:CC:DD", "id" : "11" },
{ "wwn" : "AA:00:11:BB", "id" : "2" } ]
}
Для этого я использовал команду mongo shell
db.hosts.update( { name : "Host 1", "bas.id" : "1" },
{ "$set" : { "bas.$" : { wwn : "AA:BB:CC:DD", id : "11"} }} );
который отлично работал. Теперь я хотел сделать то же самое с помощью Java-драйверов, и вот мой код
BasicDBObject example = new BasicDBObject("name", "Host 1").append("bas\uff0eid", "1");
BasicDBObject newValue = new BasicDBObject("\u0024set", new BasicDBObject("bas\uff0e\u0024", new BasicDBObject().append("wwn", "AA:BB:CC:DD).append("id","11")) ;
collection.update(example, newValue);
В приведенном выше коде мне пришлось заменить .
с \uff0
и $
с \u0024
чтобы исключить исключение. Этот вызов обновления не обновляет коллекцию. Когда я проверил BasicDBObject.toString()
JSON был таким же, как и на клавиатуре. Пожалуйста, помогите мне.
Я не понимаю, зачем вам нужно писать $
и .
как Unicode ускользает. Я попытался запустить ваш код с фактическими символами в них, и он отлично работал с драйвером Java 2.11.
Но у вашего кода есть две проблемы: 1) полная остановка .
это \u002e
, а не \uff0e
, что является совсем другим характером. 2) синтаксис последней части инструкции неверен, но это, вероятно, ошибка копирования.
Здесь код, который я использовал, и он работал нормально (я только создал объекты и фактически не запускал его против базы данных, но я не понимаю, почему это не сработает).
BasicDBObject example = new BasicDBObject("name", "Host 1").append("bas.id", "1");
BasicDBObject newValue = new BasicDBObject("$set",
new BasicDBObject("bas.$",
new BasicDBObject()
.append("wwn", "AA:BB:CC:DD").append("id","11"))) ;
Если ваш объект значения не имеет ключа, начинающегося с $, тогда он проверяет встроенный документ на наличие недопустимых символов. Можете ли вы опубликовать свой исходный код, у которого была эта проблема, без пропусков?
.
, тогда я получаюjava.lang.IllegalArgumentException: Document field names can't have a . in them. (Bad Key: 'bas.$')
. Вот почему я должен был перейти на Unicode..
, Работал отлично! благодарю вас :)