2017-01-07 102 views
2

我想更新我的_id字段中的一个文档(如下所示)。更新MongoDB中的_id字段

{ 
_id : ObjectId("586d9d5d23352af1a4aa05f7"), 
name: "Soham", 
age : 99, 
city : "XYZ" 
} 

于是我跑到下面的步骤:

var doc = db.names.find({name:"Soham"}); 
doc._id = 111 ; -- 111 is not present in that collection for any document 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
db.names.insert(doc); 

第3行还没有扔任何错误,但现在我跑了插入命令,它扔错误。任何人都可以让我知道发生了什么问题。

在此先感谢!

+1

您应该先阅读文档。 '_id'字段是**主键** MongoDB中的SQL等价物,它的格式是[ObjectId](https://docs.mongodb.com/manual/reference/method/ObjectId/)。它有一个明确的结构。所以,你**不能**为文档设置一个任意值作为id。其次,你应该**从不**这样做。你的目的是什么? –

+0

@guzgarcia MongoDB中的'_id'不一定是'ObjectId',它可以是任何你想要的东西,包括一个复杂的对象。 – GaspardP

+0

@Soham:请包括引发的错误 – GaspardP

回答

2

正在抛出一个错误,因为你的无法更新_id字段

为了设置一个新的ID,首先找到文档(使用findOne,因为您只搜索1个文档),而不需要用新ID创建一个新文档并插入它,比我们可以安全地删除旧:

var doc = db.names.find_one({name:"Soham"}); 
doc._id = 111 ; 
db.names.insert(doc); 
db.names.remove({_id:ObjectId("586d9d5d23352af1a4aa05f7")}); 
+0

非常感谢,是的,它工作。我正在做同样的事情,但不是findOne我只是使用find。无论如何,findOne工作。再次感谢。 – Soham

+0

看来find或者findOne不是问题,我们必须先插入然后移除,而不是相反。 – Soham

+0

不,不是问题,但:find将返回一个游标,该游标将评估为一个列表。 findOne将只返回1个文件。 – sergiuz