2016-06-13 13 views
1

所以我有百万条记录在几个集MongoDB数据库。下面是一些记录(大大简化)例如...MongoDB的:在全球范围内替换另一个到一个对象ID的所有引用?

收集一个文件看起来像:

{ 
    _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>), ...] 
} 

现在,这里的问题。我们意识到,我们有一些重复的(只有3或4)在集合A.并在集合B.他们每个引用的数十万次

但是,有没有实例,其中一个给定的集合体B文件引用两个不同的集合A相互重复的文档。

所以,我需要做的解决这个问题是:对于每一对在​​收集一个重复的,与_idObjectId(X)ObjectId(Y),与ObjectId(X)取代的ObjectId(Y)所有出现在集合B.

所有文件

如果我正在处理原始JSON文件,我只是做一个字符串替换和用它做。

有一个简单的方法来做到这在蒙戈外壳,只需使用一个命令对每个集合中重复的?

+0

我认为人是重复的 - 你有一种方法来选择复制(这是id字段或其他元数据?) – profesor79

+0

这只是一些特定的重复项,由手动输入错误引起。一次简单地替换其中一个引用的简单方法就可以做到这一点。 – DanM

回答

0

得到这份工作做的siplest方法是使用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 
} 
+0

好的;希望有一个简单的命令可以替代每一个实例,但是这听起来像我需要手动循环。 – DanM

相关问题