我们正在使用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
答案 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);