MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB - interpretiert bestimmte EXPLAIN-Ausgaben

Die Ausgabe dort bezieht sich insbesondere auf eine Regex, die nicht an die Anfangsposition des Strings gebunden ist. Für eine Regex, die den Index und nicht die Sammlung scannt (obwohl sie in diesem Fall den gesamten Index scannt), muss es also eine Reihe von Anfangs- und Endgrenzen geben:

Betrachten Sie die erste Abfrage mit einer anderen Regex:

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

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

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

Das bedeutet also, dass die gesamte Zeichenfolge durchsucht werden muss und die Übereinstimmung dann mit etwas endet, das "Bob" als Teil der Zeichenfolge enthält. Der erste Teil sind also die "lexikalischen" Übereinstimmungsgrenzen und der zweite Teil ist die eigentlich anzuwendende Regex:

Die folgende Abfrage zeigt dies deutlicher:

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

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

Da dieser am Anfang des Strings verankert ist, passen die einzigen zu testenden Einträge des Index "lexikalisch" zwischen "bob" und "boc". Der Regex ist wieder als zweiter Teil der Grenzen enthalten.

Die Begrenzungseinträge werden intern im Allgemeinen als "zweiteilige" Elemente beschrieben, und es gibt diesen Fall für reguläre Ausdrücke, die im ersten Teil die Zeichenfolgengrenzen haben, die für den Abgleich mit dem Index sinnvoll sind, und dann für die Regex, die auf diese Übereinstimmung angewendet wird Einträge.

Als abschließende Anmerkung siehe dann folgendes:

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

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

                            }
                    ]
            ]
    },

Das ist im Grunde dasselbe wie Ihre ursprüngliche Abfrage, die besagt, dass irgendein übereinstimmen soll Zeichenfolge.