java mongo arraylist save

时间:2012-08-26 13:05:29

标签: java mongodb 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...      
}

我想将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);    

这将在Mongo中插入文档,如下所示

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

这里有2个问题,
1.代码插入两个方括号而不是一个用于容纳数组
2.为什么不为列表生成_id。

请告诉我。
此致,Vish

1 个答案:

答案 0 :(得分:1)

$ push将值附加到数组。如果数组尚不存在,则会创建一个新数组。您推送的项目是一个数组,因此您最终得到一个数组内的数组。

没有为集合生成_id,因为这是MongoDB的正常行为。将子文档放入文档时,子文档不会获得_id。因此,数组没有_id。

也许您会问为什么数组中的元数据文档具有null _id。这是ReflectionDBObject类的行为:它包含一个_id字段,但您可以自行设置其值。您可以通过调用ReflectionDBObject实例上的set_id()将此_id设置为非null值。这样做的好地方可能是在Metadata类的构造函数中。要生成_id,请使用ObjectId.get()静态方法(org.bson.types.ObjectId)。

您在MongoDB中插入图像的代码比它需要的更复杂。以下将工作(并将摆脱嵌套数组):

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