MongoDB – demasiados datos para ordenar() sin ningún índice de error

Estoy usando MongoDB 1.6.3, para almacenar una gran colección (300k+ registros). He añadido 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 trato de ejecutar este código:

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

Estoy consiguiendo:

Mongo::OperationFailure (demasiados datos
para ordenar() con ningún índice. añadir un
índice o especificar un límite menor)

¿Qué estoy haciendo mal?

4 Kommentare

  1. 4

    Por lo que «siente» como usted está usando el índice, pero el índice es en realidad un índice compuesto. No estoy seguro de que el tipo es «lo suficientemente inteligente», para usar sólo el índice parcial.

    Por lo tanto, dos problemas:

    1. Basado en su consulta, me gustaría poner community_id como la primera parte del índice, no la segunda. updated_at.t suena como un campo en el que va a hacer las consultas de rango. Índices funcionan mejor si el rango de la consulta es el segundo bit.
    2. Cuántas entradas se van a venir de vuelta de community_id => 1? Si el número no es grande, usted puede ser capaz de salirse con la ordenación sin un índice.

    Así que puede que tenga que cambiar el índice alrededor y puede que tenga que cambiar el tipo de uso de ambos community_id y updated_at.t. Sé que parece redundante, pero empezar por ahí y comprobar los Grupos de Google si aún no funciona.

  2. 2

    Incluso con un índice, creo que todavía se puede conseguir ese error si el resultado conjunto supera los 4 mb.

    Puede ver el tamaño al entrar en la consola de mongodb y hacer 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
    }
    • No es db.de los artículos.estadísticas() ?
  3. 0

    Tener un cursor tamaño de lote que es demasiado grande la causa de este error. Ajuste el tamaño del lote no limita la cantidad de datos que puede procesar, sólo limita la cantidad de datos que se trajo de vuelta a partir de la base de datos. Al recorrer y golpeó el lote límite, el proceso de hacer otro viaje a la base de datos.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea