2016-06-13 3 views
1

だから私はいくつかのコレクションに数百万レコードでのMongoDBデータベースを持っています。さてここで問題ですmongodb:1つのObjectIDへの参照をすべて別のものに置き換えますか?

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

:ように見える

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

コレクションBの文書:ここ

コレクションA文書は次のようになり...いくつかのレコードの(大幅に簡略化)の例です。しかし、与えられたコレクションBの文書は2を参照するインスタンスがない私たちは(のみ3または4)コレクションA.で、我々はいくつかの重複を持って実現し、彼らはそれぞれのコレクションB.

に数十万回を参照しています異なるコレクション互いに重複している文書。私はこの問題を解決するために何をする必要があるかそう

は、次のとおりです。コレクションAにおける重複の各ペアについて、_idObjectId(X)ObjectId(Y)で、

コレクションB.内のすべての文書のために ObjectId(X)ObjectId(Y)の出現をすべて置き換えます

生のJSONファイルを扱っていた場合は、文字列置換を行い、それを使って終了します。

ちょうどコレクションAの重複ごとに1つのコマンドを使用して、モンゴシェルでこれを行う簡単な方法はありますか?

+0

を使用している私は、人が重複していると仮定 - あなたは重複を選択する方法がありますか(?これはidフィールドまたは他のメタデータである) – profesor79

+0

これは、手動入力エラーによって引き起こされる特定の重複のほんの一部です。一度にそれらのうちの1つにすべての参照を置き換える簡単な方法は、そのトリックを行うでしょう。 – 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

OK;すべての単一のインスタンスを置き換える単純なコマンドがあることを期待していましたが、手動でループする必要があるように思えます。 – DanM

関連する問題