我有一个查询,它选择要删除的文档.现在,我手动删除它们(使用python):
for id in mycoll.find(query, fields={}):
mycoll.remove(id)
Run Code Online (Sandbox Code Playgroud)
这似乎不是非常有效.有没有更好的办法?
编辑
好的,我遗憾地忘记提及查询细节,因为它很重要.这是完整的python代码:
def reduce_duplicates(mydb, max_group_size):
# 1. Count the group sizes
res = mydb.static.map_reduce(jstrMeasureGroupMap, jstrMeasureGroupReduce, 'filter_scratch', full_response = True)
# 2. For each entry from the filter scratch collection having count > max_group_size
deleteFindArgs = {'fields': {}, 'sort': [('test_date', ASCENDING)]}
for entry in mydb.filter_scratch.find({'value': {'$gt': max_group_size}}):
key = entry['_id']
group_size = int(entry['value'])
# 2b. query the original collection by the entry key, order it by test_date ascending, limit to the group size minus max_group_size.
for id in mydb.static.find(key, limit = group_size - max_group_size, **deleteFindArgs):
mydb.static.remove(id)
return res['counts']['input']
Run Code Online (Sandbox Code Playgroud)
那么,它做了什么?它将重复键的数量减少到最多max_group_size每个键值,只留下最新的记录.它的工作原理如下:
(key, count)对成对.count > max_group_sizekey,同时按时间戳(最早的第一个)进行排序,并将结果限制为count - max_group_size最旧的记录如您所见,这完成了将重复项减少到最多N个最新记录的任务.所以,最后两个步骤是foreach-found-remove,这是我的问题的重要细节,它改变了一切,我必须更加具体 - 抱歉.
现在,关于集合删除命令.它接受查询,但我的包括排序和限制.我可以删除吗?好吧,我试过了:
mydb.static.find(key, limit = group_size - max_group_size, sort=[('test_date', ASCENDING)])
Run Code Online (Sandbox Code Playgroud)
这种尝试失败了.而且,它似乎拧成了mongo.Observe:
C:\dev\poc\SDR>python FilterOoklaData.py
bad offset:0 accessing file: /data/db/ookla.0 - consider repairing database
Run Code Online (Sandbox Code Playgroud)
毋庸置疑,foreach-found-remove方法有效并产生预期结果.
现在,我希望我已经提供了足够的背景,并且(希望)已经恢复了我失去的荣誉.
Ser*_*sev 34
您可以使用查询删除所有匹配的文档
var query = {name: 'John'};
db.collection.remove(query);
Run Code Online (Sandbox Code Playgroud)
但要小心,如果匹配文档的数量很多,您的数据库可能会响应性降低.通常建议删除较小块的文档.
比方说,您要从集合中删除100k文档.最好执行100个删除1k文档的查询,而不是删除所有100k文档的1个查询.
Pab*_*ruz 10
您可以使用MongoDB脚本语言直接删除它:
db.mycoll.remove({_id:'your_id_here'});
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
34650 次 |
| 最近记录: |