使用Java驱动程序查找和Upsert

时间:2016-04-02 01:16:35

标签: java mongodb mongodb-query

我正在尝试将代码从旧的MongoDB驱动程序迁移到最新版本。 在旧版本中我们有类似的东西:

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的值将递增。

从我可以确定使用MongoCollection执行相同的操作我需要使用replaceOne并执行以下操作:

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字段名称$ inc

1 个答案:

答案 0 :(得分:3)

不。你想要.findOneAndUpdate()

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

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

.replaceOne()意味着"取代"提供内容的整个文档(_id除外)。这意味着此处不允许使用$inc等修饰符。

所以你改用.findOneAndUpdate()。请注意,您可能希望ReturnDocument.AFTER返回"已修改的"文件而不是"原文"应用更新之前的文档,这将是默认操作。