gpt4 book ai didi

java mongo 数组列表保存

转载 作者:可可西里 更新时间:2023-11-01 10:44:36 25 4
gpt4 key购买 nike

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

Metadata类有一些数据,实现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
}
]
]
}

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

请告诉我。
问候,Vish

最佳答案

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

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

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

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

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

关于java mongo 数组列表保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12130356/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com