$ set и позиционный оператор не работает в Java?

1

У меня есть следующий документ в коллекции 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 был таким же, как и на клавиатуре. Пожалуйста, помогите мне.

Теги:
mongodb-java

2 ответа

2
Лучший ответ

Я не понимаю, зачем вам нужно писать $ и . как 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"))) ;
  • 0
    Спасибо за ваш ответ .. Я использую 2.11.4, и если я использую . , тогда я получаю java.lang.IllegalArgumentException: Document field names can't have a . in them. (Bad Key: 'bas.$') . Вот почему я должен был перейти на Unicode.
  • 0
    Вы удар! проблема была в юникоде . , Работал отлично! благодарю вас :)
Показать ещё 5 комментариев
0

https://github.com/mongodb/mongo-java-driver/blob/master/src/main/com/mongodb/DBCollectionImpl.java#L249

Если ваш объект значения не имеет ключа, начинающегося с $, тогда он проверяет встроенный документ на наличие недопустимых символов. Можете ли вы опубликовать свой исходный код, у которого была эта проблема, без пропусков?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню