2013-07-19 58 views
0

我有一個mongo數據庫的大問題,因爲我想用一個請求更新多個字段。更新倍數字段Mongo DB

我的JSON是:

 

    db.test.findOne(); 
{ 
     "_id" : ObjectId("51e7dd16d2f8db27b56ea282"), 
     "ad" : "noc2", 
     "list" : { 
       "p45" : { 
         "id" : "p45", 
         "date" : ISODate("2014-01-01T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       }, 
       "p6" : { 
         "id" : "p6" 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       }, 
       "p4578" : { 
         "id" : "4578" 
         "date" : ISODate("2013-07-18T12:18:30.568Z"), 
         "value3" : 21, 
         "value1" : 100, 
         "value2" : 489 
       } 
     } 
} 

我想創建一個領域createdDate所有元素的列表中,如果createdDate字段不存在或爲空。

的請求例如,我在我的代碼Java進行更新一個字段使用與UPSERT真:

 
db.people.update({"advertiser":"noc2","list.4578.createdDate":{$exists:false}},{$set:{"list.p4578.createdDate":"08/08/08"}}); 

我用java試圖在那裏list.4578被變量替換,但太長太很多領域。如果我有100個字段,我會執行100個請求。

看:

public void createdFirstDateField(MongoAccess mongo, String ad,HashMap<String,Object> hfirstDate){ 



    BasicDBObject searchQuery = new BasicDBObject(); 


    Iterator <String> it = hfirstDate.keySet().iterator(); 
    String key=""; 

    while (it.hasNext()){ 

    key=it.next(); 
    searchQuery.append("ad", ad).append(key, new BasicDBObject("$exists", false)); 

    //System.out.println(key); 
    BasicDBObject doc = new BasicDBObject(); 
    doc.append("$set",new BasicDBObject(key,new Date())); 
    mongo.insert(searchQuery, doc); // update with upsert true 


    } 

} 

感謝。

回答

0

爲什麼不使用update with upsert

db.people.update({"advertiser": "noc2"}, 
       {$set: {"list.$.createdDate": "08/08/08"}}, 
       {$upsert: true); 

如果createdDate存在,它將被更新,如果沒有它會被插入。

+0

是的,我試過這個,但不好,因爲我想更新所有字段,如果createdDate只爲null,並且您的解決方案所有時間都更新createdDate字段。謝謝 – jonn

0

您可以一次更新多個文檔,using update Multi。但是並不是以原子的方式來更新多個嵌入式文檔。

您可以結帳mongodb位置運算符,但這不適合您的用例。