2013-04-12 40 views
2

在我的项目有一个结构,如下所示:更新元件不保留其类型

class User { 
    private List<MapObject> mapObjects; 
} 

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

class SubMapObject { 
    ... some additional fields 
} 

最初,用户类被填充数据(以及还包括SubMapObject类的实例)从模板,并通过MongoTemplate从Spring集成存储在MongoDB中,像这样:

mongoOps.insert(u); 

而且在MapObjects的领域每个项目的信息被保留,也是的_class它是什么。 (在案件时,它的子类)

然后,它涉及到一个地步,我们需要更新用户的MapObjects的字段中的一个元素。我们这样做是这样的:

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

是SubMapObject例如。

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

1)我们从哪里做错了,以及如何保持此对象的类的信息? 2)此外,我们想知道更新整个mapObjects字段是否比仅更新其中的特定元素更快(因为它必须在这种情况下迭代才能找到它)。很可能一个用户在其mapObjects列表中会有300-400个条目。

+0

看到一个自定义推送实现了同样的问题。什么奇怪的是,该对象的字段使用自定义转换器,但对象本身不保留_class场映射。 –

回答

0

我只是碰到这种运行和管理的解决方案。我想你也使用Spring数据MongoDB的仓库接口,如果是这样看此相关的问题在这里:How would I do $push using MongoRepository in Spring Data?了解更多详情。

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

相关问题