2016-12-19 16 views
6

私は2つのmongoコレクションを持っています.1つは生産envを参照し、もう1つはテストenvを参照しています。どのように私はそれらの2つの間の違いを比較するのですか?私はそれらをbsonにダンプしてからjsonに変換しようとしました。しかし、並べ替えが変わる可能性があり、jsonファイルが大きすぎてソートすることができないため、単純なdiffを実行することはできません。2つのコレクションのmongo差分を比較してください

答えて

5

シェルで次の操作を実行すると、コレクション内の各アイテムが繰り返し処理され、IDに基づいて各ドキュメントの一致を試みます。

は、我々は2つのコレクションdb.col1db.col2を持って言う:

> db.col1.find() 
{ "_id" : 1, "item" : 1 } 
{ "_id" : 2, "item" : 2 } 
{ "_id" : 3, "item" : 3 } 
{ "_id" : 4, "item" : 4 } 

> db.col2.find() 
{ "_id" : 1, "item" : 1 } 
{ "_id" : 2, "item" : 2 } 
{ "_id" : 3, "item" : 3 } 
{ "_id" : 4, "item" : 4 } 

私たちは、その後、2つのコレクション

function compareCollection(col1, col2){ 
    if(col1.count() !== col2.count()){ 
     return false; 
    } 

    var same = true; 

    var compared = col1.find().forEach(function(doc1){ 
     var doc2 = col2.findOne({_id: doc1._id}); 

     same = same && JSON.stringify(doc1)==JSON.stringify(doc2); 
    }); 

    return same; 
} 

を比較するために、JavaScript関数を作成することができ、呼び出し、次のようなものです:

> compareCollection(db.col1, db.col2) 
true 

3番目のコレクションがある場合db.col3

> db.col3.find() 
{ "_id" : 1, "item" : 1 } 

そして、我々が期待した結果を得るでしょう。この1

> compareCollection(db.col1, db.col3) 
false 

を比較します。我々はまた、一致するドキュメントが、切り抜いたデータdb.col4

> db.col4.find() 
{ "_id" : 1, "item" : 10 } 
{ "_id" : 2, "item" : 2 } 
{ "_id" : 3, "item" : 3 } 
{ "_id" : 4, "item" : 4 } 

を持っている第四のコレクションを持っている場合は、フィールドのサブセットのみを比較する必要がある場合は

これもfalse

> compareCollection(db.col1, db.col4) 
false 
+0

これは非常に役に立ちます。ありがとうございます! –

1

を返します(たとえば、 IDを比較する必要はありません)、次のようにすることができます。

mongoexport -d <db_name> -c <col_name> --fields "field1,field2" --type=csv | sort > export.csv 

そして、CSVファイルに簡単なdiffを実行します(source)を比較するフィールドを指定して、CSVファイルにコレクションをエクスポートします。 csvファイルの列の順序は、--fieldオプションに対応することに注意してください。

長所:

  • あなたは比較するフィールドのサブセットを指定することができます。
  • あなたはレコードの実際の差分を見ることができます。

短所:

  • フルレコードを比較するためには、可能なすべてのフィールドを知っている必要があります。
  • mongoexportは、巨大なデータベースでは遅くなる可能性があります。
0

mongodbを比較するのにStudio 3Tを使用してください。 コレクション、db、単一のレコードを比較することもできます。 mongoをダウンロードして接続するだけです。ここ は、ダウンロードリンクであるhttps://studio3t.com/

+0

その特定のツールでそれを行う方法についてのチュートリアルへのリンクを追加することもできます。 – testuser

+0

特に、この機能は無料版(「安い」ライセンスではない)の一部ではなく、エンタープライズ版のみのためです...誰かがツールを持っている場合は、実際のチュートリアルへのリンクがあります:https ://studio3t.com/whats-new/diff-mongodb/?utm_source = post&utm_medium = fb&utm_campaign = 3tslpage – testuser

2

dbHashは、トリックを行っている:

use db_name 
db.runCommand('dbHash') 

それは各コレクションのハッシュ値を返します。あなたはそれらを比較することができます。かなり正確です。

関連する問題