Mongodb更新。setOnInsert Mod on _id不允许

Mongodb更新。setOnInsert Mod on _id不允许,mongodb,Mongodb,我理解您无法更新现有mongodb文档上的_id 但是有没有理由我们不能在“setOnInsert”部分的upert中使用它?因为它是“插入”的,所以它不是更新 我的预期用途如下: db.myCol.update({_id:12345},{$setOnInsert:{_id:12345},$set:{myValue:'hi'}}); 这是一个bug还是我遗漏了什么?MongoDB将upsert查询的“查询”部分用作集合的一部分,这意味着您不必在要指定自己的“查询id”的集合部分中指定“查询id

我理解您无法更新现有mongodb文档上的_id

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

我的预期用途如下:

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

这是一个bug还是我遗漏了什么?

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

注意:我上面的查询还有一个小错误,就是缺少upsert标志

这是正确的查询:

db.myCol.update({_id:12345},{$set:{myValue:'hi'}},{upsert:true});
如果记录不存在,此查询将插入一条如下所示的记录:

{_id:12345,myValue:'hi'}

实际上,这是mongo中的一个bug,已在开发版本2.5.4或2.6.0中修复:


一旦解决了这个问题,我相信这应该能按预期工作。在一般情况下,update查询不一定指定“\u id”字段。

upsert标志在哪里?只要让setOnInsert关闭,正确的事情就会发生。db.myCol.update({u id:12345},{$set:{myValue:'hi'}})是的,你是对的,我忘了包括upsert标志。显然,如果是upsert,它会自动将“查找”部分包含到insert中。谢谢:)没错。你想把它写下来作为答案还是我应该写?如果这是一个bug,它仍然存在于3.4中。我尝试将$setOnInsert与{u id}一起使用,但它向我抛出了Mod on{u id not allowed。