Mongo - 如何聚合,过滤和包含匹配文档中的数据数组?

Mar*_*ain 15 mongodb pymongo aggregation-framework

我有一个mongo支持的联系人数据库,我试图以一堆不同的方式找到重复的条目.

例如,如果2个联系人具有相同的电话号码,则会将其标记为可能的副本,同样适用于电子邮件等.

我在Debian上使用MongoDB 2.4.2和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}
]}
Run Code Online (Sandbox Code Playgroud)

所以我可以得到重复的数字,但我不能为我的生活弄清楚如何返回实际包含这些项目的文档数组!

我想看到每个数字的这种返回数据:

# 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},
Run Code Online (Sandbox Code Playgroud)

任何帮助是极大的赞赏!

Mar*_*ain 25

啊,幸运的是.

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}}}
])
Run Code Online (Sandbox Code Playgroud)