【发布时间】:2016-11-23 16:27:46
【问题描述】:
我正在尝试在 mongodb 中实现 'server-side counter-versioned' 项目并尝试执行以下操作 /* 使用 Java API */
Document dbDoc = dbCollection.findOneAndUpdate(
new Document("_id", "meta"),
new Document("$inc", new Document("version", 1))
.append("$setOnInsert", new Document("version", 0)),
new FindOneAndUpdateOptions().upsert(true)
.returnDocument(ReturnDocument.AFTER));
假设的逻辑很简单:如果数据库中没有记录 - 从零开始计数(并且使用全新的对象),否则 - 递增计数器。
代码示例失败:'Cannot update 'version' and 'version' at the same time'
我的假设是,在 'upsert' 模式下,mongo 应该只在没有找到匹配项时使用“$setOnInsert”——但它以其他方式工作。
是否可以在一个原子 mongoDB 调用中实现这样的操作?
PS:MongoDB documentation 关于 findOneAndUpdate() 和 upsert() 是模糊的 - 至少我无法从他们的描述中理解为什么会出现这个错误。
这里也有类似的问题 - findAndModify fails with error: "Cannot update 'field1' and 'field1' at the same time - 已接受,但同样没有明确的理由。
【问题讨论】:
-
我想添加这个例子,当你有一个嵌套对象的值:{_id: 1, hours: { 0:0, 1:0, 2:0 }} 并且你想要如果文档不存在,则添加和增加一个小时,如果存在,则只增加一个小时。其实这是不可能的,也不违反任何逻辑。
标签: mongodb