【发布时间】:2016-04-15 20:10:24
【问题描述】:
我确实有一个包含多个集合的数据库(总共约 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 字段中的任何重复项(留下一个条目),将非常感激;)谢谢!
【问题讨论】:
标签: python mongodb mongodb-query pymongo aggregation-framework