2

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

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 个条目。

4

1 回答 1

0

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

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

于 2013-08-30T16:45:14.093 回答