簡體   English   中英

java mongo arraylist保存

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM