2012-02-14 8 views
1

NoSQLを初めて使ったので、これは非常に基本的であればごめんなさい。のは、私は、次のコレクションを持っているとしましょう:Dedupe MongoDB Collection

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

私は一致するもので、「重複排除」クエリを実行したいと思います:以下のいずれかの中に残り、

{ 
    a: 1, 
    b: 2 
    ... (any other properties are ignored) ... 
}, 

をので、クエリが実行された後、コレクションには、罰金のようになります。

{ 
    a: 1, 
    b: 2, 
    c: 'y' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

OR

{ 
    a: 1, 
    b: 2, 
    c: 'x' 
}, 
{ 
    a: 1, 
    b: 1, 
    c: 'y' 
} 

a == 1、b == 2の文書が1つしかない限り、ちょうどそうです。

答えて

6

あなたは常に1つのドキュメントのみが任意のaを与えていることを確実にしたい場合は、b組み合わせ、あなたはabに一意のインデックスを使用することができます。

db.collection.ensureIndex({a: 1, b: 1}, {unique: true, dropDups: true}) 
+0

くそ、それについて忘れてしまった: –

+0

これはすべての可能なケースでは機能しません(例えば、{a:{$ in:[1,2]}}のすべてのダプを削除します)あなたが実際にインデックスを必要としない場合は、インデックスを直ちにドロップしたいかもしれませんが –

+0

これは組み込みドキュメントでは機能しますか? – Jeff

0

私はその場であなたのコレクションを更新します任意のコマンドを知りませんが、あなたは確かにそれを行うことができます。インデックスを作成するときは、1つの重複以外はすべて削除されますdropDupsオプションを与えることができます一時保管による。

  1. グループあなたの基準でドキュメント(フィールドab
  2. 各グループのためにそれからすべての文書を選択します。テンポラリコレクションtmpに保存します。残りのグループを破棄します。
  3. オリジナルコレクションをtmpの文書で上書きします。

これはMapReduceまたはそれ以降のAggregation Framework(現在は不安定なブランチにあります)で行うことができます。

私はここでコードを書かないことを決めました。なぜなら、あなたから学ぶ喜びを感じるからです。 :)