2010-12-09 7 views
21

Estoy usando MongoDB 1.6.3, para almacenar una gran colección (300k + registros). Agregué un índice compuesto.MongoDB: demasiados datos para ordenar() sin error de índice

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 trato de ejecutar este código:

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

que estoy recibiendo:

datos

Mongo :: OperationFailure (demasiado para la especie() con ningún índice Agregue un índice o especifique un límite más pequeño)

¿Qué estoy haciendo mal?

Respuesta

14

Intente agregar {community_id: 1, 'updated_at.t': -1} índice. Primero debe buscar por community_id y luego ordenar.

+2

La columna de ordenación debe ser la última columna del índice. http://www.mongodb.org/display/DOCS/Indexing+Advice+and+FAQ#IndexingAdviceandFAQ-1.Thesortcolumnmustbethelastcolumnusedintheindex. –

4

Por lo tanto, "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.

Así que dos problemas:

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

Así que puede que tenga que cambiar el índice de alrededor y puede que tenga que cambiar el tipo de usar tanto community_id y updated_at.t. Sé que parece redundante, pero comienza allí y consulta los Grupos de Google si aún no funciona.

2

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

Puede ver el tamaño por entrar en la consola MongoDB y hacer esto:

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

que 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 
} 
0

que tienen un tamaño de cursor por lotes que es 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.

Cuestiones relacionadas