2012-02-11 11 views
11

2つのコレクション間のすべてのドキュメントを '比較'しようとしました.2つのコレクション間のすべてのドキュメントのみが真である場合にtrueを返します。2 mongodbのコレクションを比較するには?

私はコレクションのメソッドを探していましたが、これを行うことができませんでした。

私はモンゴシェルでこれらのようなものを試したが、私は期待どおりに動作しません:

db.test1 == db.test2 

または

db.test1.to_json() == db.test2.to_json() 

をとにかく、イムは、Javaでのスプリング・データにMongoDBを使用。

あなたのご意見をお寄せください!ありがとうございました。

+3

'db.runCommand( 'dbHash')'を使うと、コレクションのハッシュと別のコレクションのハッシュを比較できるdbとコレクションのハッシュを得ることができます。両方のコレクションが同じであるかどうかを知ることは簡単かもしれません。 – Rexford

答えて

13

thisのようなmongodb evalとカスタムequals関数を組み合わせて試してみることができます。

最初のケースでは、同じではないオブジェクト参照を比較しているため、メソッドが機能しません。 2番目のケースでは、to_jsonが同じオブジェクトであっても同じ文字列を生成するという保証はありません。

var compareCollections = function(){ 
    db.test1.find().forEach(function(obj1){ 
     db.test2.find({/*if you know some properties, you can put them here...if don't, leave this empty*/}).forEach(function(obj2){ 
      var equals = function(o1, o2){ 
       // here goes some compare code...modified from the SO link you have in the answer. 
      }; 

      if(equals(ob1, obj2)){ 
       // Do what you want to do 
      } 
     }); 
    }); 
}; 

db.eval(compareCollections); 

あなたはそのコードがクライアントにコレクションをフェッチせずに、データベースサーバ側で実行されることを確認db.eval付:

代わりに、このような何かを試してみてください。

+0

アイデアありがとう。私が正しく理解していれば、実際には2つのループがあり、test1の1つのドキュメントがtest2のすべてのドキュメントでテストされます。あるいは、あなたが意味するのは、私の場合、test1にあるものは同じidを持つtest2になければならないので、test2.findの引数にはobj1のIDを入れます。また、test2がtest1よりも多くの文書を持っている場合、あるいはtest1がtest2よりも多くの文書を持っている場合、私の場合はtest1とtest2が等しくないことを意味しています。コレクションの両側でループすることなくこれらを検出することについての考えはありますか?ありがとう! – bertie

+0

このコードは、両方のコレクションを通過し、2番目のコレクションの最初のコレクションから一致するものが見つかったときに何かを行います(または一致が見つからない場合は何もできます)。if(!equals(...)両方のコレクションが等しいかどうかを比較するには、これを多く最適化することができます。たとえば、db.test1.findを実行する前に、db.test1.find()などの両方のコレクションのカウントを比較できますcount()== db .test2.find()。count()...そしてcountが等しくなければ、続ける理由はありません。また、私がコードを指摘したように、(_idのように)あなたが知っているいくつかのプロパティがある場合続き...) –

+0

は、db.test2.find({...ここ...})内に置くことができ、2番目のオブジェクトの検索をスピードアップします。)したがって、カウントが等しい場合には、 !equals(...))そして、あなたのコレクションは等しい...重要なことは、最後に、db.evalを使用してコードがサーバー上で直接実行されていることを確認することです。フェッチ両方のコレクションをクライアントに送信すると、多くのことが遅くなる可能性があります。 –

関連する問題