Como apagar documentos por consulta eficientemente em mongo?

Eu tenho uma consulta, que seleciona documentos para serem removidos. Agora, eu removê-los manualmente, assim (usando python):

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

Isso não parece ser muito eficiente. Existe uma maneira melhor?

EDITAR

OK, devo desculpas por esquecer de mencionar os detalhes da consulta, porque é importante. Aqui está o código python completo:

<code>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']
</code>

Então, o que isso faz? Reduz o número de chaves duplicadas para no máximomax_group_size por valor de chavedeixando apenas os registros mais novos. Funciona assim:

MR os dados para(key, count) pares.Iterar todos os pares comcount > max_group_sizeConsultar os dados porkey, enquanto classifica-o ascendente pelo timestamp (o mais antigo primeiro) e limitando o resultado aocount - max_group_size registros mais antigosApague todos os registros encontrados.

Como você pode ver, isso realiza a tarefa de reduzir as duplicatas para no máximo N registros mais recentes. Então, os últimos dois passos sãoforeach-found-remove e este é o detalhe importante da minha pergunta, que muda tudo e eu tive que ser mais específico sobre isso - desculpe.

Agora, sobre o comando de remoção de coleção. Aceita a consulta, mas o meu inclui classificação e limitação. Posso fazer isso com remover? Bem, eu tentei:

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

Essa tentativa falha miseravelmente. Além disso, parece estragar mongo.Observe:

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

Escusado será dizer que a abordagem foreach-found-remove funciona e produz os resultados esperados.

Agora, espero ter fornecido contexto suficiente e (espero) ter restaurado minha honra perdida.

questionAnswers(4)

yourAnswerToTheQuestion