2012-05-07 58 views
2

我有兩個型號:的MongoDB和UPSERT問題

1 ResourceVacation:

@Id 
    private String resourceID; 
    private List<Vacation> vacationList; 

2 - 休假:

@Id 
private String id; 
private String start; 
private String title; 

的JSON的ResourceVacation後,我插了進去:

{「_id」:「foo」,「_class」:「com.test.mod el.ResourceVacation」, 「vacationList」:[{ 「_id」: 「1」, 「啓動」: 「ABC」, 「標題」: 「測試」} ]}

我需要UPSERT一個假期;如果我需要的resourceId已經存在於ResourceVacation中,請將「vacationList」替換爲我擁有的json。

ELSE: 插入一個新的ResourceVacation

Vacation vacation = new Vacation("a", "a", "a"); 
    List<Vacation> list = new ArrayList<Vacation>(); 
    list.add(vacation); 

    ResourceVacation resourceVacation = new ResourceVacation("foo", list); 
    MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate(); 
    DBCollection db = mongoOperations.getCollection("resourceVacation"); 

    BasicDBObject myQuery = new BasicDBObject("_id", resourceVacation.getResourceID()); 
    BasicDBObject myUpdate = new BasicDBObject("push ", new BasicDBObject("vacationList", 
      resourceVacation.getVacationList())); 

    db.update(myQuery, myUpdate); 

我得到以下異常:

java.lang.IllegalArgumentException: can't serialize class com.springway.model.Vacation 
+0

我也需要提出一個假期。 – ericsoco

回答

1

首先,它看起來並不像你都做一個更新插入。 Java API中的語法的第三個參數將db.update設置爲true。

db.update(com.mongodb.DBObject, com.mongodb.DBObject, boolean /*upsert */, boolean /* multi */) 

你不應該做$推要麼 - 你想你說的話在蒙戈殼裏做將是語義:

db.collection.update({"resourceVacation":resourceID}, {$set:{"vacationList":[...]}, true) 

這是說:如果有RESOURCEID resourceVacation存在,然後製作其「vacationList」我給你的東西。如果它不存在,則插入此記錄。

如果您直接使用Java API,上面的等價物就足夠了。

看起來像你使用Spring的MongoTemplate。您需要檢查您使用的是哪個版本,因爲它不允許使用upserts。該問題被標記爲已解決。如果您遇到舊版本,則說明here有一個解決方法。

如果你是最新的,你應該能夠直接使用新添加的upsert方法,如here所述。

+0

我已經使用了以下內容,它會更新記錄(如果存在),否則它什麼也不做!你知道我該如何解決它! mongoOperations.updateFirst(new Query(Criteria.where(「_ id」)。is(「foo」)), \t Update.update(「vacationList」,resourceVacation.getVacationList()),ResourceVacation.class); – Echo

+0

您需要添加另一個參數來指示「upsert」爲true(默認情況下不是)。有關詳細信息,請參閱此處:http://api.mongodb.org/java/2.2/com/mongodb/DBCollection.html#update –

+0

我已經使用過它,但它引發了所提及的異常:java.lang。IllegalArgumentException:無法序列化類com.springway.model.Vacation – Echo

0

該異常可能是由updateFirst方法的已知錯誤引起的。看看here