2012-08-26 116 views
2

我們正在使用Java服務器和Mongo DB [普通Java-Mongo,而不是Morphia或某些此類CRUD工具]。
我們正處於一個圖像POJO類及其相關的元數據如下圖所示,java mongo arraylist保存

public class Img{ 
    private String name; 
    private List<Metadata> imgMetaList = new ArrayList<Metadata>(); 

    //Getters, setters etc... 
    public List<Metadata> getImgMetaList() {   
     return imgMetaList; 
    } 
} 

元數據類有一些數據,實現Serializable接口沒有工作,所以
我伸出ReflectionDBObject,

public class Metadata extends ReflectionDBObject{ 
    private String tag; 
    private String val; 

    //Getters, setters etc...  
} 

我想將Img存入Mongo。我用下面的代碼,它的工作。

BasicDBObject updateQuery = new BasicDBObject(); 
updateQuery.put("name", img.getName()); 
BasicDBObject updMetadata = new BasicDBObject(); 
updMetadata.put("$push", new BasicDBObject("imgMetaList",img.getImgMetaList())); 
collection.update(updateQuery,updMetadata, true, false);  

這會插入在蒙戈如下一個文件,

{ 
    "_id" : ObjectId("503a1991db2e9f431cf0d162"), 
    "name" : "test.jpg", 
    "imgMetaList" : [ 
     [ 
      { 
        "Tag" : "tag1", 
        "Val" : "val1", 
        "_id" : null 
      } 
     ] 
    ] 
} 

在這裏有2個問題,
1.代碼插入2個方括號而不是一個來容納陣列
2 。爲什麼不是爲列表生成_id。

請讓我知道。
Regards,Vish

+1

關於第一個問題:$推追加值字段,如果字段是一個現有的陣列,否則將現場到數組[值]如果字段不存在。由於您使用$ push插入List,因此會創建兩個方括號。對於第二個問題,我不知道爲什麼_id沒有生成。 –

回答

1

$ push將值附加到數組。如果該數組尚不存在,則會創建一個新數組。您推送的項目是一個數組,所以您最終會在數組中放入一個數組。

集合中沒有生成_id,因爲這是MongoDB的正常行爲。當您將一個子文檔放入一個文檔中時,該子文檔不會得到一個_id。因此該數組沒有_id。

也許相反,你是問爲什麼你的元數據文件,在數組內,有一個null _id。這是ReflectionDBObject類的行爲:它包含一個_id字段,但您可以自行設置其值。您可以通過調用ReflectionDBObject實例上的set_id()將此_id設置爲非空值。做這件事的好地方可能在你的Metadata類的構造函數中。要生成_id,請使用ObjectId.get()靜態方法(org.bson.types.ObjectId)。

你在MongoDB中插入圖片的代碼比它需要的更復雜。下面的工作(和將擺脫嵌套數組):

BasicDBObject imageDoc = new BasicDBObject(); 
imageDoc("name", img.getName()); 
imageDoc("imgMetaList", img.getImgMetaList()); 
collection.insert(imageDoc); 
+0

謝謝伊恩,這非常有幫助。問候,Vish。 –