【问题标题】:findAndModify fails with error: "Cannot update 'field1' and 'field1' at the same timefindAndModify 失败并出现错误:“无法同时更新 'field1' 和 'field1'
【发布时间】:2014-07-22 11:08:15
【问题描述】:

我正在尝试构建 MongoDB Java findAndModify 查询。

主要目的是我想自己在插入查询中设置_id

这是我的代码:

BasicDBObject findFilter = new BasicDBObject("type", "group")
//
BasicDBObject dialogInsertObject = new BasicDBObject("name", "my group").append("_id", new ObjectId());
//
BasicDBObject dialogUpdateObject = new BasicDBObject("name", "my group");
//
BasicDBObject upsertMap = new BasicDBObject();
upsertMap.append("$setOnInsert", dialogInsertObject);
upsertMap.append("$set", dialogUpdateObject);


DBObject dialogObject = dialogCollection.findAndModify(findFilter, 
   new BasicDBObject("_id", "1"), null, false, upsertMap, true, true);

我得到一个错误:

com.mongodb.CommandFailureException: { "serverUsed" : "localhost:27017" , 
  "errmsg" : "exception: Cannot update 'name' and 'name' at the same time" , 
  "code" : 16836 , "ok" : 0.0}

有人可以帮忙吗

【问题讨论】:

  • 和错误说的差不多。您不能同时在 $setOnInsert$set 中设置相同的内容。您的 dialogInsertObject 值也被覆盖。
  • 抱歉,更新了 dialogInsertObject。为什么我不能在单个查询中使用 $set 和 $setOnInsert?
  • @NeilLunn 如文档所述, $setOnInsert 用于插入,但 $set 用于更新操作。怎么了?
  • 不是你应该说“阅读文档”的人,因为我确信我比大多数人更了解他们。您可以同时使用这两个术语,但问题是您在两者中都使用了相同的“字段”。如果不是这个,请冷静下来阅读我最初所说的话。

标签: java mongodb mongodb-query mongodb-java


【解决方案1】:

这里的本质问题是:

db.collection.update(
   { "type": "group" },
   { 
      "$set": { "mygroup": "value" }
      "$setOnInsert" { "mygroup": "value" }
   }
)

这基本上就是你想要做的。

您不能将 $set 操作中的 same 字段作为 $setOnInsert 操作处理。

导致您遇到的错误的逻辑存在一般问题。

【讨论】:

  • 所以,我应该只将 _id 包含到 $setOnInsert 中,这是一个正确的解决方案。谢谢
  • @IgorKhomenko 底线是,如果您在两个语句中引用 same 事物,则在实际插入某些事物时会引起冲突。但我希望你现在能看到。
  • 这也戳到我了,第一个评论是错误的。您应该只在 $set 块中指定它,因为即使在插入新文档时也会应用 $set。它们不是互斥的(熟悉 MySQL ON DUPLICATE KEY 语法让我很困惑)。
猜你喜欢
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-10
  • 1970-01-01
  • 2021-04-24
相关资源
最近更新 更多