sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB:interpreta la salida de explicación particular

La salida allí es particular a una expresión regular que no está vinculada a la posición inicial de la cadena. Entonces, para una expresión regular que escaneará el índice y no la colección (aunque escaneará todo el índice en este caso), debe haber un conjunto de límites iniciales y límites finales:

Considere la primera consulta con una expresión regular diferente:

db.collection.find({ "username": /bob/ }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "",
                            {

                            }
                    ],
                    [
                            /bob/,
                            /bob/
                    ]
            ]
    },

Eso significa que hay una cadena completa para buscar y luego la coincidencia terminará en algo que contenga "bob" como parte de la cadena. Entonces, la primera parte son los límites de coincidencia "léxicos" y la segunda parte es la expresión regular real que se aplicará:

La siguiente consulta muestra esto más claramente:

db.collection.find({ username: /^bob/ }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "bob",
                            "boc"
                    ],
                    [
                            /^bob/,
                            /^bob/
                    ]
            ]
    },

Dado que está anclado al comienzo de la cadena, las únicas entradas del índice que deben probarse coinciden "léxicamente" entre "bob" y "boc". La expresión regular vuelve a estar contenida como la segunda parte de los límites.

Las entradas de límites generalmente se describen internamente como elementos de "dos partes", y existe este caso para las expresiones regulares, que en la primera parte tiene los límites de cadena que tienen sentido para hacer coincidir el índice, y luego para que la expresión regular se aplique a los que coinciden enteros.

Como nota final, vea lo siguiente:

db.collection.find({ username: {$gt: ""} }).explain()

    "indexBounds" : {
            "username" : [
                    [
                            "",
                            {

                            }
                    ]
            ]
    },

Que es intrínsecamente lo mismo que su consulta inicial, que dice que coincida con cualquiera cadena.