2012-05-07 11 views
2

私は2つのモデルがあります:私はそれを挿入した後ResourceVacationためのMongoDBとアップサート問題

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

JSON::

1-ResourceVacation:

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

2-休暇を

{"_id": "foo"、 "_class": "com.test.mod el.ResourceVacation」、 "vacationList":[{ "_id": "1"、 "開始": "ABC"、 "タイトル": "テスト"} ]}

Iがアップサートする必要が私が必要とするresourceIdがすでにResourceVacationに存在する場合は、 "vacationList"をjsonに置き換えます。

ELSE

: 私は、次の例外を取得

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); 

新しいResourceVacationを挿入します。

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

私も休暇をupsertする必要があります。 – ericsoco

答えて

1

まず、それはあなたがすべてでアップサートを行っているようには見えません。 Java APIの構文では、db.updateの3番目の引数がtrueに設定されています。

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

あなたはどちらか$プッシュを行うべきではありません - あなたはモンゴシェルでやりたい言うことの意味は次のようになります。

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

これは言う:resourceVacationはRESOURCEIDが存在した場合には、それから私があなたに与えているものを "vacationList"にしてください。存在しない場合は、このレコードを挿入します。

Java APIを直接使用している場合は、上記と同等のもので十分です。

あなたはSpringのMongoTemplateを使用しているようです。 upsertsを許可するのに使用しなかったため、使用しているバージョンを確認する必要があります。その問題は解決されたとマークされます。あなたが古いバージョンについていないなら、hereの回避策があります。

最新の場合は、hereのように、新しく追加されたupsertメソッドを直接使用することができます。

+0

私は以下を使用していますが、レコードが存在する場合は更新します。それ以外は何もしません!私はそれを修正する方法を知っていますか? mongoOperations.updateFirst(新しいクエリ(Criteria.where( "_ id")。is( "foo"))、 \t \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