gpt4 book ai didi

mongodb - 如何在mongo中有效地通过查询删除文档?

转载 作者:IT老高 更新时间:2023-10-28 13:08:00 27 4
gpt4 key购买 nike

我有一个查询,它选择要删除的文档。现在,我手动删除它们,就像这样(使用 python):

for id in mycoll.find(query, fields={}):
mycoll.remove(id)

这似乎不是很有效。有没有更好的办法?

编辑

好的,我很抱歉忘记提及查询细节,因为这很重要。这是完整的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']

那么,它有什么作用?它将重复键的数量减少到每个键值最多 max_group_size 个,只留下最新的记录。它的工作原理是这样的:

  1. MR 数据到 (key, count) 对。
  2. 使用 count > max_group_size
  3. 遍历所有对
  4. key查询数据,同时按时间戳升序排序(最早的在前)并将结果限制为count - max_group_size最旧的记录
  5. 删除所有找到的记录。

如您所见,这完成了将重复项减少到最多 N 个最新记录的任务。所以,最后两个步骤是 foreach-found-remove,这是我的问题的重要细节,它改变了一切,我必须更具体地说明它 - 抱歉。

现在,关于集合删除命令。它确实接受查询,但我的包括排序和限制。我可以用删除来做吗?嗯,我试过了:

mydb.static.find(key, limit = group_size - max_group_size, sort=[('test_date', ASCENDING)])

这次尝试惨败。而且,它似乎把mongo搞砸了。观察:

C:\dev\poc\SDR>python FilterOoklaData.py
bad offset:0 accessing file: /data/db/ookla.0 - consider repairing database

不用说,foreach-found-remove 方法有效并产生了预期的结果。

现在,我希望我已经提供了足够的背景信息,并且(希望)恢复了我失去的荣誉。

最佳答案

您可以使用查询来删除所有匹配的文档

var query = {name: 'John'};
db.collection.remove(query);

但请注意,如果匹配文档的数量很多,您的数据库可能会响应迟缓。通常建议以较小的 block 删除文档。

假设您有 100k 文档要从集合中删除。执行 100 次删除 1k 文档的查询比执行 1 次删除所有 100k 文档的查询要好。

关于mongodb - 如何在mongo中有效地通过查询删除文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10014181/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com