【问题标题】:Mongodb update. setOnInsert Mod on _id not allowedMongoDB更新。 _id 上的 setOnInsert Mod 不允许
【发布时间】:2013-04-19 11:57:48
【问题描述】:

我了解您无法在现有 mongodb 文档上更新 _id 的事实。

但是有没有理由我们不能在“setOnInsert”部分的 upsert 中使用它?因为它是“插入时”,所以它不是更新。

我的预期用法是这样的:

db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}});

这是一个错误还是我错过了什么?

【问题讨论】:

  • upsert 标志在哪里?只需将 setOnInsert 关闭,正确的事情就会发生。 db.myCol.update({_id:12345},{$set:{myValue:'hi'}})
  • 是的,你是对的,我忘了包括 upsert 标志。显然,如果它是 upsert,它会自动将 find 部分包含到插入中。谢谢:)
  • 完全正确。你想把它写成答案还是我应该写?

标签: mongodb


【解决方案1】:

MongoDB 将 upsert 查询的“查询”部分用作集合的一部分,这意味着您不必在要指定自己的 _id 的集合部分中指定 _id。

注意:我上面的查询也有一个小错误,即缺少 upsert 标志。

这是正确的查询:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true});

如果记录不存在,则此查询将插入一条如下所示的记录:

{_id:12345,myValue:'hi'}

【讨论】:

    【解决方案2】:

    真的,这是在开发版本 2.5.4 或版本 2.6.0 中修复的 mongo 中的错误:

    https://jira.mongodb.org/browse/SERVER-9958

    一旦解决了这个问题,我相信这应该可以正常工作。一般情况下,更新查询不一定指定“_id”字段。

    【讨论】:

    • 如果这是一个错误,它仍然存在于 3.4 中。我尝试将 $setOnInsert 与 {_id} 一起使用,但它会将 Mod on _id not allowed 在我身上。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 2020-07-07
    • 2022-11-10
    • 2015-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多