手动更改MongoID

时间:2014-01-02 10:59:47

标签: mongodb mongoid

在将问题插入到MongoDB中的问题时,Denver Matt在this question的答案中解释说,我在MongoDB的数据集中创建了重复的ID。修复PHP代码很简单,但是为了能够仍然使用我的数据集,我想知道:

我可以手动更改MongoId而不会破坏某些内容吗?或者我可以将此ID重新设置为新ID吗?

1 个答案:

答案 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旧文档