¿Cómo borrar documentos por consulta eficientemente en mongo?
Tengo una consulta, que selecciona los documentos que se eliminarán. En este momento, los elimino manualmente, como este (usando python):
<code>for id in mycoll.find(query, fields={}): mycoll.remove(id) </code>
Esto no parece ser muy eficiente. ¿Hay alguna manera mejor?
EDITAR
De acuerdo, le debo una disculpa por olvidarme de mencionar los detalles de la consulta, porque es importante. Aquí está el código completo de python:
<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>
¿Entonces Qué es lo que hace? Reduce el número de claves duplicadas a lo sumomax_group_size
por valor clave,dejando solo los últimos registros. Funciona así:
(key, count)
paresIterar sobre todas las parejas concount > max_group_size
Consulta los datos porkey
, mientras lo ordena ascendiendo por la marca de tiempo (la más antigua primero) y limitando el resultado a lacount - max_group_size
registros más antiguosEliminar todos y cada uno de los registros encontrados.Como puede ver, esto logra la tarea de reducir los duplicados a un máximo de N registros más nuevos. Así, los dos últimos pasos sonforeach-found-remove
Y este es el detalle importante de mi pregunta, eso lo cambia todo y tuve que ser más específico al respecto, lo siento.
Ahora, sobre el comando de eliminación de colección. Acepta consulta, pero la mía incluye la clasificación y la limitación. ¿Puedo hacerlo con eliminar? Bueno, he intentado:
<code>mydb.static.find(key, limit = group_size - max_group_size, sort=[('test_date', ASCENDING)]) </code>
Este intento fracasa estrepitosamente. Por otra parte, parece atornillar mongo. Observa:
<code>C:\dev\poc\SDR>python FilterOoklaData.py bad offset:0 accessing file: /data/db/ookla.0 - consider repairing database </code>
No hace falta decir que el enfoque foreach-found-remove funciona y produce los resultados esperados.
Ahora, espero haber proporcionado suficiente contexto y (con suerte) haber restaurado mi honor perdido.