2016-04-02 3 views
1

古いMongoDBドライバのコードを最新のバージョンに移行しようとしています。Javaドライバを使用した検索とアップグレード

BasicDBObject query = new BasicDBObject("foo", "foo"); 
int value = 1; 
BasicDBObject field = new BasicDBObject("seq", value); 
BasicDBObject update = new BasicDBObject("$inc", field); 
DBObject o = getDBCollection().findAndModify(query, null, null, false, update, true, true); 

「foo」で文書が存在しなかった場合、それが作成されます:私たちはこのような何かを持っていた古いバージョンで 。 存在していた場合は、seqの値が増分されます。私はreplaceOneを使用して、このような何かをする必要がありますするMongoCollectionを使用して同じことをやって決めることができるものから、

Document query = new Document("foo", "foo"); 
int value = 1; 
Document field = new Document("seq", value); 
Document update = new Document("$inc", field); 
UpdateOptions options = new UpdateOptions().upsert(true); 
UpdateResult ret = getMongoCollection().replaceOne(query, update, options); 

が、これはjava.lang.IllegalArgumentExceptionがになります:無効なBSONフィールド名$株式会社

答えて

1

あなたは.findOneAndUpdate()をしたい:

FindOneAndUpdateOptions options = new FindOneAndUpdateOptions() 
    .upsert(true) 
    .returnDocument(ReturnDocument.AFTER); 

UpdateResult ret = getMongoCollection().findOneAndUpdate(query, update, options); 

.replaceOne()はまさにそれを意味し、提供されたコンテンツで(_id除く)ドキュメント全体を「置き換え」。つまり、$incのような修飾語は許可されていません。

代わりに.findOneAndUpdate()を使用してください。 ReturnDocument.AFTERは、更新が適用される前の「元の」ドキュメントではなく、「変更された」ドキュメントを返すことを希望します。これはデフォルトのアクションです。

+0

これはうまくいきました - ありがとうございます。以前はfindOneAndUpdateを使ってみましたが、それらのオプションはありませんでした。それはクリンチャーだった。 –

関連する問題