2014-12-20 2 views
2

Вот мой документ:Как обновить частичный вложенный документ в MongoDB используя Java

{ "_id" : ObjectId("5495cfcaec1e18b48015bba3"), 
    "Type" : "1", 
    "DomainSize" : "60", 
    "Metadata" : { "visit" : "3550", 
       "website" : "1", 
       "Specifics" : { "Size:" : "2", 
           "Type:" : "Janes", 
           "Closure Type:" : "Slip-On"}, 
        "cat" : "2", 
        "function" : "6"}, 
    "rate" : " 95.5% "} 

Я хочу обновить несколько ключей из метаданных, которые я не знаю заранее. Мой ввод - это карта ключей и значений, которые существуют внутри списка метаданных. Я завершаю карту с другой Картой, что ключом является «Метаданные» и значение данной карты.

Map<String,Map<String,String>> metadata =new HashMap(); 
metadata.put("Metadata", values); 

Так что я в конечном итоге с

<"Metadata", Map<Key,Value>> 

Тогда я использовал следующее:

m_collection.update(new BasicDBObject("_id",id) , new BasicDBObject("$set", new BasicDBObject(metadata))); 

Запись обновить существующие ключи внутри вложенной карты, добавляя '[]' каждому значению и удаление всех ключей, которые не были обновлены.

Для примера приведена карта {'visit': '3558' , 'website' : '20'}.

После обновленное я в конечном итоге с:

{ "_id" : ObjectId("5495cfcaec1e18b48015bba3"), 
     "Type" : "1", 
     "DomainSize" : "60", 
     "Metadata" : { "visit" : ["3558"], 
        "website" : ["20"]}, 
     "rate" : " 95.5% "} 

Что я сделал не так?

ответ

1

Вы вызываете $ set на «метаданные», который отбрасывает все, что есть, и устанавливает новое значение с тем, что вы передаете. Если вы хотите частично обновить документ, подобный этому, вам либо придется пройти полный документ, отражающий новое состояние или просто выпуск $ set updates: по одному для каждого поля.

+0

гм ... не могу я вытащить объект из БД и поместить вытаскивать значение метаданных, которые это карта, затем поместить значения обновления внутри карты, сложить все и поместить в db? Я просто боюсь иметь много звонков в БД. на самом деле операция обновления будет вызываться с примерно 30 ~ обновленными значениями и почти каждую секунду (это всего лишь небольшая часть приложения). – USer22999299

+2

Вы можете сделать это, но это будет полный раунд для каждого документа. Может быть, все в порядке, и, возможно, это не так, но вам нужно будет учитывать влияние производительности. – evanchooly

Смежные вопросы