Обновление массива в MongoDB с использованием драйвера Java - PullRequest
20 голосов
/ 23 июля 2011

Я использую MongoDB с официальным драйвером Java (версия 2.6.3). У меня есть коллекция MongoDB, которая содержит списки покупок. Список покупок имеет формат

{ "_id" : { "$oid" : "4e2af1f43f8de96494d5271d"} ,
  "name" : "default" ,
  "items" : [ { "description" : "Cheese" , "quantity" : 1 , "unit" : "kg"} ,
              { "description" : "Water" , "quantity" : 3 , "unit" : "bottle"} ] }

Теперь я хочу добавить новый элемент в список с помощью метода update(), равного DBCollection. Но что бы я ни пытался, это не сработает, хотя и говорит мне

{ "updatedExisting" : true , "n" : 1 , "connectionId" : 63 , "err" :  null  , "ok" : 1.0}

Мой код выполняет следующие действия:

    BasicDBObject updateQuery = new BasicDBObject();
    updateQuery.put( "name", "default" );

    BasicDBObject updateCommand = new BasicDBObject();
    updateCommand.put( "$push", new BasicDBObject( "items", newShoppingItem ) );
    WriteResult result = shoppingLists.update( updateQuery, updateCommand, true, true );

newShoppingItem - это BasicDBObject, который содержит данные для нового элемента. Я также пытался создать параметры update() с BasicDBObjectBuilder и JSON.parse(), но это не имеет значения.

Я также посмотрел другие посты, попробовал гуглить, но безрезультатно. Что я делаю не так?

Спасибо за любую помощь!
Оливер

1 Ответ

10 голосов
/ 24 июля 2011

да, приведенный выше код работает отлично.Теперь я знаю, где была моя ошибка.Я хотел сделать это пуленепробиваемым, поэтому я подумал, что в конце лучше использовать save () для DBCollection и явно сохранить список покупок DBObject:

shoppingLists.save( shoppingList );

Я сейчас читаю в некоторых другихфорум о том, что объекты, которые вы извлекаете из базы данных, впоследствии не синхронизируются с базой данных (сейчас это звучит логично для меня :)).Поэтому я каждый раз переписывал изменения самостоятельно.После удаления строки выше это сработало:)

Итак, одно важное правило: когда вы обновляете ваш DBCollection - это отправляется непосредственно в базу данных!- не сохраняйте DBObject, который вы запрашивали перед обновлением!Это перезапишет ваше обновление!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...