MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB - interpreta l'output di spiegazione particolare

L'output è particolare per una regex che non è vincolata alla posizione iniziale della stringa. Quindi, per una regex che eseguirà la scansione dell'indice e non della raccolta (anche se in questo caso eseguirà la scansione dell'intero indice) è necessario un insieme di limiti iniziali e finali:

Considera la prima query con un'espressione regolare diversa:

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

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

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

Ciò significa che c'è un'intera stringa da cercare e quindi la corrispondenza finirà su qualcosa che contiene "bob" come parte della stringa. Quindi la prima parte è il limite di corrispondenza "lessicale" e la seconda parte è l'espressione regolare da applicare:

La seguente query lo mostra più chiaramente:

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

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

Poiché è ancorato all'inizio della stringa, le uniche voci dell'indice che devono essere verificate corrispondono "lessicamente" tra "bob" e "boc". La regex è nuovamente contenuta come seconda parte dei limiti.

Le voci dei limiti sono generalmente descritte internamente come elementi "a due parti", e c'è questo caso per le espressioni regolari, che nella prima parte hanno i limiti di stringa che hanno senso per la corrispondenza dell'indice, e quindi per la regex da applicare a quelle che corrispondono intero.

Come nota finale, vedere quanto segue:

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

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

                            }
                    ]
            ]
    },

Che è intrinsecamente la stessa della tua query iniziale, che dice di corrispondere a qualsiasi stringa.