python - pymongo:删除重复项( map 减少?)

标签 python mongodb mongodb-query pymongo aggregation-framework

我确实有一个包含多个集合(总共约 1500 万个文档)的数据库,文档看起来像这样(简化):

{'Text': 'blabla', 'ID': 101}
{'Text': 'Whuppppyyy', 'ID': 102}
{'Text': 'Abrakadabraaa', 'ID': 103}
{'Text': 'olalalaal', 'ID': 104}
{'Text': 'test1234545', 'ID': 104}
{'Text': 'whapwhapwhap', 'ID': 104}

它们也都有一个唯一的 _id 字段,但我想根据另一个字段(外部 ID 字段)删除重复项。

首先,我尝试了一种非常手动的方法,包括列表并随后删除,但数据库似乎太大,需要很长时间并且不实用。

其次,以下内容不再适用于当前的 MongoDB 版本,即使有人建议这样做。

db.collection.ensureIndex( { ID: 1 }, { unique: true, dropDups: true } )

所以,现在我正在尝试创建一个 map reduce 解决方案,但我真的不知道我在做什么,尤其是很难使用另一个字段(不是数据库 _id)来查找和删除重复项。这是我糟糕的第一种方法(从一些内部来源采用):

map = Code("function(){ if(this.fieldName){emit(this.fieldName,1);}}")
reduce = Code("function(key,values) {return Array.sum(values);}")
res = coll.map_reduce(map,reduce,"my_results");

response = []
for doc in res.find():
    if(doc['value'] > 1):
        count = int(doc['value']) - 1
        docs = col.find({"fieldName":doc['ID']},{'ID':1}).limit(count)
        for i in docs:
            response.append(i['ID'])

coll.remove({"ID": {"$in": response}})

如果能减少外部 ID 字段中的重复项(留下一个条目),我们将不胜感激 ;) 谢谢!

最佳答案

另一种方法是使用 aggregation framework 性能优于 map-reduce。考虑以下聚合管道,它是聚合管道的第一阶段, $group 运算符按 ID 字段对文档进行分组,并使用 将分组记录的每个 _id 值存储在 unique_ids 字段中$addToSet 运算符。 <强> $sum 累加器运算符将传递给它的字段的值相加,在本例中为常量 1 - 从而将分组记录的数量计入计数字段。另一个流水线步骤 $match 过滤计数至少为 2 的文档,即重复项。

一旦你从聚合中得到结果,你迭代游标以删除 unique_ids 字段中的第一个 _id,然后将其余的插入一个数组,该数组将被稍后用于删除重复项(减去一个条目):

cursor = db.coll.aggregate(
    [
        {"$group": {"_id": "$ID", "unique_ids": {"$addToSet": "$_id"}, "count": {"$sum": 1}}},
        {"$match": {"count": { "$gte": 2 }}}
    ]
)

response = []
for doc in cursor:
    del doc["unique_ids"][0]
    for id in doc["unique_ids"]:
        response.append(id)

coll.remove({"_id": {"$in": response}})

关于python - pymongo:删除重复项( map 减少?),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34722866/

相关文章:

performance - mongo高效地从大集合中删除数据

MongoDB:是否将批量操作作为一个整体写入操作日志?

node.js - 如何在 Mongoose 中插入多个文档并需要 Mongoose 验证?

python - OpenCV python 图像冲刷

python - 这个随机 PCA 操作会完成吗?

python - Django 从 json 对象查询 View 中的 MongoDB ObjectId

java - 何时在 lucene 中进行索引

python - Pygame 程序停止响应,没有错误

python - Groupby 在 2 列上加上在 String 列上的过滤器

node.js - 使用docker连接nodejs和mongo