¿Cómo eliminar documentos por consulta de manera eficiente en mongo?

Tengo una consulta, que selecciona los documentos que se eliminarán. En este momento, los elimino manualmente, así (usando python):

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

Esto no parece ser muy eficiente. ¿Hay una mejor manera?

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:

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

¿Entonces Qué es lo que hace? Reduce el número de claves duplicadas a máximo max_group_size por valor clave, dejando solo los registros más nuevos . Funciona así:

  1. MR los datos para (key, count) pares.
  2. Itera sobre todos los pares con count > max_group_size
  3. Consultar los datos por key , ordenándolos de forma ascendente por la marca de tiempo (la más antigua primero) y limitando el resultado al count - max_group_size registros más antiguos
  4. Eliminar todos y cada uno de los registros encontrados.

Como puede ver, esto lleva a cabo la tarea de reducir los duplicados a, como máximo, N registros más recientes. Entonces, los dos últimos pasos son foreach-found-remove y este es el detalle importante de mi pregunta, que lo cambia todo y tenía que ser más específico al respecto, lo siento.

Ahora, sobre el comando de eliminar colección. Acepta consultas, pero las mías incluyen clasificación y limitación. ¿Puedo hacerlo con eliminar? Bueno, lo he intentado:

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

Este bash falla miserablemente. Por otra parte, parece atornillar mongo.Observar:

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

Huelga 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.

Puede usar una consulta para eliminar todos los documentos coincidentes

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

Tenga cuidado, sin embargo, si el número de documentos que coinciden es alto, su base de datos puede ser menos receptiva. A menudo se recomienda eliminar documentos en trozos más pequeños.

Digamos que tiene 100k documentos para eliminar de una colección. Es mejor ejecutar 100 consultas que eliminen documentos 1k cada uno que una consulta que borre todos los documentos 100k.

Puede eliminarlo directamente utilizando el lenguaje de scripts MongoDB:

 db.mycoll.remove({_id:'your_id_here'}); 

¿ deleteMany() sería más eficiente? Recientemente descubrí que remove() es bastante lento para documentos de 6 m en una colección de documentos de 100 m. Documentación en ( https://docs.mongodb.com/manual/reference/method/db.collection.deleteMany )

 db.collection.deleteMany( , { writeConcern: , collation:  } ) 

Ejecute esta consulta en cmd

db.users.remove ({“_id”: ObjectId (“5a5f1c472ce1070e11fde4af”)});

Si está utilizando node.js, escriba este código

 User.remove({ _id: req.body.id },, function(err){...});