with sort pretty natural mongodb database-design mongodb-indexes mongodb-ruby nosql

mongodb - pretty - mongoose sort



MongoDB: demasiados datos para sort() sin error de índice (4)

Entonces "se siente" como si estuviera usando el índice, pero el índice es en realidad un índice compuesto. No estoy seguro de que el género sea "lo suficientemente inteligente" como para usar solo el índice parcial.

Entonces dos problemas:

  1. Según su consulta, pondría community_id como la primera parte del índice, no la segunda. updated_at.t suena como un campo en el que harás consultas de rango. Los índices funcionan mejor si la consulta de rango es el segundo bit.
  2. ¿Cuántas entradas van a volver de community_id => 1 ? Si el número no es grande, puede salirse con la suya simplemente sin un índice.

Por lo tanto, es posible que tenga que cambiar el índice y es posible que tenga que cambiar el orden para usar tanto community_id como updated_at.t . Sé que parece redundante, pero comienza allí y consulta los Grupos de Google si aún no funciona.

Estoy usando MongoDB 1.6.3, para almacenar una gran colección (300k + registros). Agregué un índice compuesto.

db[''collection_name''].getIndexes() [ { "name" : "_id_", "ns" : "db_name.event_logs", "key" : { "_id" : 1 } }, { "key" : { "updated_at.t" : -1, "community_id" : 1 }, "ns" : "db_name.event_logs", "background" : true, "name" : "updated_at.t_-1_community_id_1" } ]

Sin embargo, cuando intento ejecutar este código:

db[''collection_name''] .find({:community_id => 1}) .sort([''updated_at.t'', -1]) .skip(@skip) .limit(@limit)

Estoy obteniendo:

Mongo :: OperationFailure (demasiados datos para ordenar () sin índice. Agregar un índice o especificar un límite más pequeño)

¿Qué estoy haciendo mal?


Incluso con un índice, creo que aún puede obtener ese error si su conjunto de resultados excede los 4MB.

Puedes ver el tamaño yendo a la consola de mongodb y haciendo esto:

show dbs # pick yours (e.g., production) use db-production db.articles.stats()

Terminé con resultados como este:

{ "ns" : "mdalert-production.encounters", "count" : 89077, "size" : 62974416, "avgObjSize" : 706.9660630690302, "storageSize" : 85170176, "numExtents" : 8, "nindexes" : 6, "lastExtentSize" : 25819648, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 18808832, "indexSizes" : { "_id_" : 3719168, "patient_num_1" : 3440640, "msg_timestamp_1" : 2981888, "practice_id_1" : 2342912, "patient_id_1" : 3342336, "msg_timestamp_-1" : 2981888 }, "ok" : 1 }


Pruebe agregar {community_id: 1, ''updated_at.t'': -1} index. Primero debe buscar por community_id y luego ordenar.


Tener un tamaño de lote de cursor demasiado grande causará este error. Establecer el tamaño del lote no limita la cantidad de datos que puede procesar, solo limita la cantidad de datos que se recuperan de la base de datos. Cuando repite y alcanza el límite de lote, el proceso realizará otro viaje a la base de datos.