2013-07-18 3 views
10

私はmongo-backedコンタクトデータベースを持っています。私は、さまざまな方法で重複したエントリを見つけようとしています。例えばMongo - どのようにして一致するドキュメントのデータの配列を集約し、フィルタリングし、組み込むことができますか?

、2つの接点は、電子メールの同上をそれらが可能重複としてフラグ付けされている同じ電話番号を持っている場合など

私はpyMongoとMongoEngineでのDebian上でMongoDBの2.4.2を使用しています。

私がこれまでに見つけてカウントを同じ電話番号を含むレコードをされている最も近い:

dbh.person_document.aggregate([ 
    {'$unwind': '$phones'}, 
    {'$group': {'_id': '$phones', 'count': {'$sum': 1}}}, 
    {'$sort': SON([('count', -1), ('_id', -1)])} 
]) 

# Results in 
{u'ok': 1.0, 
u'result': [{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, u'count': 5}, 
      {u'_id': {u'number': u'205-265-6666', u'showroom_id': 5}, u'count': 5}, 
      {u'_id': {u'number': u'213-785-7777', u'showroom_id': 5}, u'count': 4}, 
      {u'_id': {u'number': u'334-821-9999', u'showroom_id': 5}, u'count': 3} 
]} 

だから私は重複している番号を取得することができますが、私は私の図の生活のためにすることはできませんこれらのアイテムが実際に含まれていたドキュメントの配列を返す方法

私は、各番号の戻りこの種のデータを見たい:

# The ObjectIDs of the documents that contained the duplicate phone numbers 
{u'_id': {u'number': u'404-231-4444', u'showroom_id': 5}, 
    u'ids': [ObjectId('51c67e322b2192121ec4d8f2'), ObjectId('51c67e312b2192121ec4d8f0')], 
    u'count': 2}, 

すべてのヘルプは大歓迎です!

答えて

16

ああ、恵まれている。

解決策はほとんど単語がMongoDB - Use aggregation framework or mapreduce for matching array of strings within documents (profile matching)にあります。

最終結果、名前含まれるように、いくつかの余分なを追加:

dbh.person_document.aggregate([ 
    {'$unwind': '$phones'}, 
    {'$group': { 
     '_id': '$phones', 
     'matchedDocuments': { 
      '$push':{ 
       'id': '$_id', 
       'name': '$full_name' 
       }}, 
     'num': { '$sum': 1} 
    }}, 
    {'$match':{'num': {'$gt': 1}}} 
]) 
関連する問題