【问题标题】:mongodb: Globally replace all references to one ObjectID with another?mongodb:全局替换对一个 ObjectID 的所有引用?
【发布时间】:2016-06-13 17:56:50
【问题描述】:

所以我有一个 MongoDB 数据库,在几个集合中包含数百万条记录。这是一些记录的(非常简化的)示例...

Collection A 文档如下所示:

{ 
  _id: ObjectID(....)
  name: "Hubert Humphrey"
}

集合 B 文档如下所示:

{
  _id: ObjectID(....)
  ReferenceSummary: [
    { 
      person: ObjectID(<some-ID-from-Collection-A>)
      count: 312
    },
    { 
      person: ObjectID(<some-other-ID-from-Collection-A>)
      count: 42
    },
    ...
  ], 
  TopPeople: [ ObjectID(<another-ID-from-Collection-A>), ObjectID(<yet-another-ID-from-Collection-A>), ...]
}

现在问题来了。我们意识到我们在 Collection A 中有几个重复项(只有 3 或 4 个)。在 Collection B 中,它们每个都被引用了数十万次。

但是,没有给定集合 B 文档引用两个不同的集合 A 文档的情况,这些文档是彼此重复的。

所以,我需要做的是解决这个问题:对于集合 A 中的每一对重复项,使用 _idObjectId(X)ObjectId(Y),将所有出现的 ObjectId(Y) 替换为 ObjectId(X) Collection B 中的所有文档。

如果我处理的是原始 JSON 文件,我只需进行字符串替换即可。

有没有一种简单的方法可以在 mongo shell 中执行此操作,只需对每个 Collection A 副本使用一个命令?

【问题讨论】:

  • 我假设那个人是重复的——你有办法选择重复的吗(这是通过 id 字段或其他元数据?)
  • 只是少数特定的重复,是手动输入错误造成的。一次替换对其中一个的所有引用的简单方法可以解决问题。

标签: javascript mongodb mongo-shell


【解决方案1】:

完成这项工作的最简单方法是使用 forEach 循环

var ids = [id1, id2, ...., idN];
var idsToReplace = [id1TR, id2TR, ...., IdNTR];
var aLenght = ids.lenght;

for (var i = o; i < aLenght; i++) {
    db.collectionA.find({
        _id : ids[i]
    }).forEach(function (doc) {
        doc.fieldA = idsToReplace[i];
        // if we habve an array entry we need to iterate thru it
        var arrayXLenght = doc.arrayX.lenght;
        for (var j = 0; j < arrayXLenght; j++) {
            if (doc.arrayX[j].field === ids[i]) {
                doc.arrayX[j].field = idsToReplace[i];
            }
        }

        prinjson(doc); //verify changes
        //doc.save() //uncoment when you wil be assured that changes are ok
    })

    // same thing with other collection
}

【讨论】:

  • 好的;希望有一个简单的命令可以替换每个实例,但听起来我确实需要手动循环。
猜你喜欢
  • 2018-07-15
  • 2016-01-02
  • 2020-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-12
相关资源
最近更新 更多