我有几个集合(整体〜15密耳文档)和文档的数据库看起来像这样(简化):pymongo:删除重复(图减少?)
{'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 })
所以,现在我想创建一个映射精简解决方案,但我真的不知道我在做什么,尤其是在使用另一个字段(不是数据库_id)查找并删除重复的难度。这是我的坏第一种方法(从一些INTERENT源通过):
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字段的任何副本(留一个条目),将是非常apprechiated;)谢谢!
的MongoDB 2.6是告诉我DeprecationWarning:除去已被弃用。改为使用delete_one或delete_many。 – wordsforthewise