【问题标题】:How to update the _id field in a mongodb document [duplicate]如何更新mongodb文档中的_id字段[重复]
【发布时间】:2014-06-01 13:10:29
【问题描述】:

我有以下格式的文件:

{
  _id: "1232014",
  account: "123",
  year: 2014,
  country: 826
}

_id 字段由account 字段和year 字段组合而成。

但是,我后来发现同一年的同一个帐户可以在不同国家/地区拥有数据,并且我遇到了重复键错误。

我需要做的是将country 字段也作为_id 字段的一部分,例如

_id: "1232014826"

由于我使用文档中的值作为更新的一部分,我认为我不能使用$set,因此我尝试在forEach() 查询中使用save()

db.account_data.find({"_id" : "1232014"}).forEach(function(doc) {
    doc._id = doc._id + doc.country;
    db.collection.save(doc);
});

这不起作用。

有没有办法更新_id?或者这是不可能的,因为它是主键字段?

【问题讨论】:

  • @JoachimIsaksson 可能不是因为它实际上是一个非常糟糕的答案。让我们尝试删除旧的和错误的答案,并用更好的答案替换它们。
  • 我现在看到这与您提到的另一个问题类似。希望这个问题有更多的细节和背景,如果其他人有同样的问题,可能会有用。这实际上是那个问题的不被接受的答案,它与我需要的东西最相关。

标签: mongodb


【解决方案1】:

是的,这是不可能的,因为它主键字段。如果您真的想这样做,那么您实际上要做的是插入一个新文档并删除旧文档:

db.account_data.find({"_id" : "1232014"}).forEach(function(doc) {
    var oldId = doc._id;
    var doc._id = doc._id + doc.country;
    db.collection.remove({ _id: oldId });
    db.collection.save(doc);
});

【讨论】:

  • 谢谢,这是我需要的答案,我想我可以删除 .find() 参数来更新整个集合。
  • 当我运行查询时,我最终得到了一些带有多次附加国家的项目!例如1232014826826826826826。我不知道这是否是因为 doc._id 被设置为自身,导致某种递归错误。为了解决这个问题,我使用从头开始创建的 _id 运行查询,即 var doc._id = doc.account + doc.year + doc.country; 运行良好。对此的任何想法表示赞赏。
猜你喜欢
  • 1970-01-01
  • 2011-04-30
  • 2013-09-22
  • 1970-01-01
  • 2017-01-01
  • 1970-01-01
相关资源
最近更新 更多