2013-04-12 39 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字段。

相關問題