gpt4 book ai didi

java - 使用 MongoDB 更新文档中数组中的元素而不保留其类型

转载 作者:搜寻专家 更新时间:2023-10-30 20:57:23 24 4
gpt4 key购买 nike

在我的项目中有这样一个结构:

class User {
private List<MapObject> mapObjects;
}

class MapObject {
... some fields...
}

class SubMapObject {
... some additional fields
}

最初,User 类由模板中的数据(还包括 SubMapObject 类的实例)填充,并通过 Spring 集成中的 MongoTemplate 存储在 MongoDB 中,如下所示:

mongoOps.insert(u);

并且保留了 mapObjects 字段中每个条目的信息,还有 _class 的信息。 (在它是子类的情况下)

接下来我们需要更新 User 的 mapObjects 字段中的单个元素。我们这样做:

mongoOps.updateFirst(
query(where("_id").is(userObjectId).and("mapObjects._id")
.is(mo.get_id())), update("mapObjects.$", mo),
User.class);

例如,mo 是 SubMapObject。

每当传递(MapObject 的)任何子类实例时,有关该对象的 MongoDB 记录中它是什么类(_class)字段的信息都会丢失,它会被视为其父类 - MapObject。所以我们有以下问题:)

1) 我们哪里做错了,如何保存这个对象类的信息?

2) 此外,我们想知道更新整个 mapObjects 字段是否比仅更新其中的特定元素更快(因为在这种情况下它必须迭代才能找到它)。单个用户很可能在其 mapObjects 列表中有 300-400 个条目。

最佳答案

我刚刚遇到这个问题并管理了一个解决方案。我假设您也在使用 Spring Data for MongoDB Repository 接口(interface),如果是这样,请在此处查看此相关问题:How would I do $push using MongoRepository in Spring Data?了解更多详情。

基本思想是,一旦您为您的存储库连接了自定义类,那么最后一步就是使用从您的上下文中注入(inject) mongo 映射转换器。然后,不是传递您的对象,而是首先将其转换为 DBObject 并保存该 DBObject。转换器应按预期写出一个 _class 字段。

关于java - 使用 MongoDB 更新文档中数组中的元素而不保留其类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15970641/

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