Sortierung auf mehrere Felder Mongo DB
Ich habe eine Abfrage in mongo so möchte ich den Vorzug geben, um den ersten Bereich und den zweiten Bereich.
Sagen, ich habe die Abfrage, so dass
db.col.find({category: A}).sort({updated: -1, rating: -1}).limit(10).explain()
So, ich habe die folgenden index -
db.col.ensureIndex({category: 1, rating: -1, updated: -1})
Funktionierte es nur zu einer Geldstrafe Scannen Sie so viele Objekte wie benötigt, d.h. 10
Aber jetzt brauche ich für die Abfrage
db.col.find({category: { $ne: A}}).sort({updated: -1, rating: -1}).limit(10)
So, ich habe die folgenden index -
db.col.ensureIndex({rating: -1, updated: -1})
aber das führt das Scannen des gesamten Dokuments und wenn ich
db.col.ensureIndex({ updated: -1 ,rating: -1})
Scannt es weniger Anzahl der Dokumente, die
Ich möchte nur Fragen, klar zu sein über die Sortierung nach mehreren Feldern und was ist die Reihenfolge, die erhalten werden, wenn dies zu tun. Durch das Lesen der mongo-DB-Dokumente klar, dass das Feld, auf dem wir brauchen, um die Sortierung sollte das Letzte Feld. Das ist also der Fall, dass ich angenommen in meinem $ne Abfrage vor. Mache ich etwas falsch?
InformationsquelleAutor der Frage Global Warrior | 2012-09-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die MongoDB Abfrageoptimierer funktioniert, indem Sie versuchen verschiedene Pläne, um zu bestimmen, welcher Ansatz am besten funktioniert für eine bestimmte Abfrage. Die preisgekrönten plan für das Abfrage-Muster wird dann zwischengespeichert, für die nächsten ~1,000 Abfragen oder bis Sie eine
explain()
.Zu verstehen, die Abfragepläne in Betracht gezogen wurden, sollten Sie verwenden
erklären(1)
zB:Den
allPlans
detail zeigt alle Pläne, die verglichen wurden.Wenn Sie eine Abfrage ausführen, die nicht sehr selektiv (zum Beispiel, wenn viele Datensätze, die Ihren Kriterien entsprechen der
{category: { $ne:'A'}}
), kann es schneller sein, für MongoDB finden Sie Ergebnisse mit einem BasicCursor (table scan) eher als Abgleich mit einem index.Die Reihenfolge der Felder in der Abfrage in der Regel nicht einen Unterschied machen Sie für die index-Auswahl (es gibt wenige Ausnahmen mit range-queries). Die Reihenfolge der Felder in einem Art wirkt sich auf die index-Auswahl. Wenn Ihr
sort()
Kriterien nicht entsprechen, die index-Reihenfolge, die Ergebnis-Daten werden neu sortiert nach dem index benutzt wird (Sie sollten sehenscanAndOrder:true
in der explain-Ausgabe, wenn das passiert).Es ist auch erwähnenswert, dass MongoDB verwenden nur ein index pro Abfrage (mit Ausnahme von
$or
s).Also, wenn Sie versuchen, die Abfrage zu optimieren:
Werden Sie wollen, um alle drei Felder in den index:
FYI, wenn Sie erzwingen möchten, dass eine bestimmte Abfrage einen index (in der Regel nicht notwendig oder empfehlenswert), es ist ein
Hinweis()
option, die Sie ausprobieren können.InformationsquelleAutor der Antwort Stennie
Dass ist wahr, aber es gibt zwei Schichten von der Bestellung, die Sie hier haben, da Sie die Sortierung auf einem compound index.
Als Sie bemerkt, wenn das erste Feld für den index entspricht dem ersten Feld Sortieren, es funktionierte und der index zu sehen war. Allerdings, wenn arbeiten anders herum tut es nicht.
Als solche durch Ihre eigenen obersvations der Bestellung benötigt werden, bewahrt Abfrage-Reihenfolge der Felder von der ersten bis zur letzten Seite. Die mongo-analyser kann manchmal zu bewegen, die Felder entsprechend einem index, aber normalerweise wird es nur versuchen und mit dem ersten Bereich, wenn es nicht es wird es zu überspringen.
InformationsquelleAutor der Antwort Sammaye
versuchen, diesen code erfolgt die Sortierung zuerst Daten basierend auf dem Namen dann halten die 'name' in der Schlüsselhalter wird es Art 'filter'
InformationsquelleAutor der Antwort Gajender Singh