web-dev-qa-db-ja.com

Mongo-一致するドキュメントからのデータの配列を集約、フィルタリング、および含めるにはどうすればよいですか?

モンゴが支援する連絡先データベースを使用していて、さまざまな方法で重複するエントリを見つけようとしています。

たとえば、2つの連絡先の電話番号が同じである場合、重複の可能性があるとしてフラグが付けられ、電子メールの場合も同様です。

PyMongoとMongoEngineを備えたDebianでMongoDB2.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},

どんな助けでも大歓迎です!

15
Marcel Chastain

ああ、祝福されます。

ほぼWordfor Wordの解決策を MongoDB-ドキュメント内の文字列の配列を照合するために集計フレームワークまたはmapreduceを使用(プロファイル照合) で見つけました。

最終結果、名前を含めるためにいくつかの追加を追加します。

dbh.person_document.aggregate([
    {'$unwind': '$phones'},
    {'$group': {
        '_id': '$phones',
        'matchedDocuments': {
            '$Push':{
                'id': '$_id',
                'name': '$full_name'
                }},
        'num': { '$sum': 1}
    }},
    {'$match':{'num': {'$gt': 1}}}
])
24
Marcel Chastain