Tengo una colección en usuarios con nombre mongodb. Estoy tratando de encontrar el recuento de todos los documentos en la colección.
Sorprendentemente, las siguientes consultas están dando resultados diferentes. Para
db.users.find({}).count()
y
`db.users.count()`
la salida es 533911, y para
db.users.aggregate( [ { $group: { _id: "$_id" } }, { $group: { _id : null, count : { $sum : 1 } } } ] )
y
db.users.aggregate( [ { $group: { _id : null, count : { $sum : 1 } } } ] )
la salida es 533950.
¿Alguien puede decirme por qué la agregación y las consultas normales arrojan resultados diferentes? Gracias de antemano por cualquier ayuda.
Veo 2 posibles razones:
Si su colección está fragmentada, debe usar el marco de agregación para contar documentos porque la operación de conteo puede ser inexacta debido a movimientos de fragmentos o documentos huérfanos. Cómo contar en clústeres fragmentados
Si está utilizando el motor de almacenamiento WiredTiger (lo que es más probable ahora, ya que es el predeterminado desde V3.2), las estadísticas almacenadas por WiredTiger pueden ser inexactas después de un apagado incorrecto. Debe ejecutar db.collection.validate()
en cada colección. Apagado sucio de WiredTiger
Nota: puede reducir la "confusión" eliminando los documentos huérfanos con el comando cleanupOrphaned , pero en un entorno fragmentado siempre debe usar el marco de agregación.
db.users.aggregate( [ { $group: { _id: "$_id" } }, { $group: { _id : null, count : { $sum : 1 } } } ] )
está contando valores nulos también.
db.users.count()
sin contar los valores nulos.