我正在尝试将代码从旧的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
答案 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
返回"已修改的"文件而不是"原文"应用更新之前的文档,这将是默认操作。