[英]java mongo arraylist save
我們使用的是Java服務器和Mongo DB [純Java-Mongo,而不是Morphia或CRUD的某些此類工具]。
我們有一個Image Pojo類及其相關的元數據,如下所示,
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...
}
我想將圖像保存到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);
如下所示,這會在Mongo中插入文檔,
{
"_id" : ObjectId("503a1991db2e9f431cf0d162"),
"name" : "test.jpg",
"imgMetaList" : [
[
{
"Tag" : "tag1",
"Val" : "val1",
"_id" : null
}
]
]
}
這里有兩個問題,
1.代碼插入兩個方括號而不是一個方括號來容納數組
2.為什么沒有為列表生成_id。
請告訴我。
問候,Vish
$ push將一個值附加到數組。 如果該陣列尚不存在,則會創建一個新的陣列。 您要推送的項目是一個數組,因此最終在數組中包含一個數組。
不會為集合生成_id,因為這是MongoDB的正常行為。 當您將子文檔放在文檔中時,該子文檔不會獲得_id。 因此,該數組沒有_id。
也許相反,您是在問為什么數組中的元數據文檔的_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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.