2016-06-13 15 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

相關問題