Mongo - Как мога да събера, филтрирам и включа масив от данни от съвпадащите документи?

Имам база данни с контакти, поддържана от mongo, и се опитвам да намеря дублиращи се записи по куп различни начини.

Например, ако 2 контакта имат един и същ телефонен номер, те се маркират като възможен дубликат, същото за имейл и т.н.

Използвам MongoDB 2.4.2 на Debian с pyMongo и MongoEngine.

Най-близкото, което имам досега, е намирането и преброяването на записи, които съдържат един и същ телефонен номер:

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},

Всяка помощ е високо ценена!


person Marcel Chastain    schedule 18.07.2013    source източник


Отговори (1)


Ах, благословен да си.

Намерих решението почти дума по дума на 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}}}
])
person Marcel Chastain    schedule 18.07.2013