2016-02-17 48 views
3

我在我的MongoDB中有一個包含數千個文檔的集合。 每個文檔看起來像目前這樣:在MongoDB中添加新字段到對象文檔

{ 
    "_id" : ObjectId("1"), 
    "FIELD1" : { 
     "STR1" : "some text", 
     "STR2" : "some text", 
     "STR3" : "some text", 
     "STR4" : "some text" 
    }, 
    "FIELD2" : "some text" 
} 

用下面的代碼片段,我設法一個新字段添加到ALL 4000+文件:

// Add new field to all documents 
BasicDBObject query = new BasicDBObject(); 
BasicDBObject update = new BasicDBObject(); 
update.put("$set", new BasicDBObject(NEW_DB_FIELD_NAME, new BasicDBObject())); 
WriteResult result = coll.update(query, update, true, true); 

的文件有一個新的結構,其中FIELD3是一個Object

{ 
    "_id" : ObjectId("1"), 
    "FIELD1" : { 
     "STR1" : "some text", 
     "STR2" : "some text", 
     "STR3" : "some text", 
     "STR4" : "some text" 
    }, 
    "FIELD2" : "some text", 
    "FIELD3" : { 
    } 
} 

現在的問題是,我想多個項目添加到FIELD3 w ^這裏的每個項目是包含2 String秒的Object

{ 
    "_id" : ObjectId("1"), 
    "FIELD1" : { 
     "STR1" : "some text", 
     "STR2" : "some text", 
     "STR3" : "some text", 
     "STR4" : "some text" 
    }, 
    "FIELD2" : "some text", 
    "FIELD3" : { 
     "ITEM1" : { 
      "STR1" : "", 
      "STR2" : "" 
     }, 
     "ITEM2" : { 
      "STR1" : "", 
      "STR2" : "" 
     }, 
     "ITEM3" : { 
      "STR1" : "", 
      "STR2" : "" 
     } 
    } 
} 

我曾嘗試是這樣的:

BasicDBObject query = new BasicDBObject{"FIELD2","some text"}; 
BasicDBObject update = new BasicDBObject(); 
update.put("$set", new BasicDBObject("FIELD3.ITEM1.STR1", "some text").append("FIELD3.ITEM1.STR2", "some text"); 
result = coll.update(query, update, true, false); 

的問題是,我只能得到FIELD3下一個新項目。當我通過項目循環時,它不斷被新值取代。

請幫忙!

UPDATE:

隨着@Explosion丸的幫助下,我已成功地所有的ITEM1ITEM2ITEM3等添加到我的新創建FIELD3。然而,我現在有另一個問題,我有'重複'項目中的value字段是相同的。我不想那樣。

什麼是刪除重複的優雅方式?或者,甚至更好,什麼是插入非重複的優雅方式?

我之前對重複問題的描述不夠清楚。事情是,不同的項目必須有不同的名稱,例如ITEM1,ITEM2等;否則,他們會互相替換。我想要比較的是他們的value

如果我將數據存儲在不同的結構中會更好嗎?我在想,如果FIELD3應該改爲ArrayList而不是Object。 目前,它類似於後面的,我希望用「WATERMELON」字段刪除重複的水果。

FRUITS 
    > FRUIT1 
     > WATERMELON 
     > BIG 
    > FRUIT2 
     > WaTeRMeLON 
     > BIG 
    > FRUIT3 
     > APPLE 
     > SMALL 

請幫忙!

+0

我已更新我的帖子,以更清楚地說明我的新問題。你能幫我嗎? @爆炸藥 – Tacocat

+0

Nvm!我已經知道了,哈哈! @Explosion Pills – Tacocat

回答

1

我設法通過改變我的數據存儲結構來解決我自己的無重複問題。如果有人有興趣...

// Creating an ArrayList to store all the different fruits 
ArrayList<BasicDBObject> newField = new ArrayList<BasicDBObject>(); 
for (...) { 
    String value = ""; 
    String type = ""; 
    BasicDBObject newItem = new BasicDBObject("value", value).append("type", type); 
    newField.add(newItem); 
} 

// Removing duplicates from ArrayList 
Set<BasicDBObject> setItems = new LinkedHashSet<BasicDBObject>(newField); 
newField.clear(); 
newField.addAll(setItems); 

// Adding ArrayList of fruits into database 
BasicDBObject update = new BasicDBObject(); 
update.put("$set", new BasicDBObject("FRUITS", newField)); 
WriteResult result = coll.update({"_id":"1"}, update, true, false); 

注意:使用LinkedHashSet代替HashSet意味着順序被保留。

1

This post表示要爲要創建的每個對象使用單獨的BasicDBObject。這是冗長的,但我還沒有找到另一種方式來做到這一點。

BasicDBObject item1 = new BasicDBObject("STR1", "text").append("STR2", "txt"); 
// also for item2 and item3... 

BasicDBObject field3 = new BasicDBObject("ITEM1", item1).append("ITEM2", item2); 

update.put("$set", new BasicDBObject("FIELD3", field3)); 
+0

好的。 NVM。我應該能夠適應這一點,以獲得我所需要的。稍後會試用,謝謝! – Tacocat

相關問題