在将问题插入到MongoDB中的问题时,Denver Matt在this question的答案中解释说,我在MongoDB的数据集中创建了重复的ID。修复PHP代码很简单,但是为了能够仍然使用我的数据集,我想知道:
我可以手动更改MongoId而不会破坏某些内容吗?或者我可以将此ID重新设置为新ID吗?
答案 0 :(得分:1)
文档的_id
字段是不可变的,如this documentation中所述。尝试修改其值将导致错误/异常,如:
> db.foo.drop()
> db.foo.insert({ _id: 1 })
> db.foo.update({ _id: 1 }, { $set: { _id: 3 }})
Mod on _id not allowed
> db.foo.find()
{ "_id" : 1 }
如果确实需要更改文档的标识符,可以获取它,修改_id
值,然后使用insert()
或save()
重新保留文档。 insert()
可能更安全,因为新_id
价值冲突的可能性很小,而您更愿意看到唯一性错误,而不是覆盖现有文档(如save()
那样)。之后,您需要返回并删除原始文档。
由于您无法在单个原子事务中完成所有这些操作,因此我建议采用以下操作顺序:
findOne()
现有文件_id
_id
属性insert()
将修改过的文档重新放回集合insert()
remove()
succeeded,_id
旧文档