【问题标题】:java mongo arraylist savejava mongo 数组列表保存
【发布时间】:2012-08-26 13:05:28
【问题描述】:

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

请告诉我。
问候,维什

【问题讨论】:

  • 对于您的第一个问题:如果字段是现有数组,则 $push 将值附加到字段,否则如果字段不存在,则将字段设置为数组 [值]。由于您使用 $push 插入列表,因此它会创建两个方括号。对于你的第二个问题,我不知道为什么 _id 没有生成。

标签: java mongodb arraylist save


【解决方案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);

【讨论】:

  • 谢谢伊恩,这很有帮助。问候,维什。
猜你喜欢
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2012-03-08
  • 1970-01-01
  • 2018-07-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多