2

我们正在使用 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。

请告诉我。
问候, 维什

4

1 回答 1

1

$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);
于 2012-08-27T06:38:03.510 回答