Kann MongoDB verwenden Sie einen index, wenn die überprüfung auf die Existenz eines Feldes mit $exists-operator?
Wenn ich Daten in meine users
Sammlung, die so aussieht wie:
{ name: '...',
email: '...',
...,
photos: {
123: { url: '...', title: '...', ... },
456: { url: '...', title: '...', ... },
...
}
}
Und ich möchte, um herauszufinden, welcher Benutzer besitzt die Foto-id 127 ist, dann bin ich mit der Abfrage:
db.users.find( {'photos.127': {'$exists' => true} } );
Hab ich versucht, aber es scheint nicht möglich zu bekommen, MongoDB, um einen index für diese Abfrage. Die index, die ich versuchte, war: db.users.ensureIndex({photos:1});
. Und wenn ich explain()
mongo sagte mir, es war mit einem BasicCursor (d.h., kein index verwendet wurde).
Ist es möglich, einen index zu schaffen, mongo der für diese Abfrage?
InformationsquelleAutor bantic | 2011-11-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Nein, es gibt keine Möglichkeit zu sagen, mongodb nutzen-index für die exists-Abfrage vorzunehmen. Indizierung ist vollständig in Bezug auf Daten -. Da $existiert, ist nur mit dem Schlüssel (Felder) es kann nicht verwendet werden, die in Indizes.
$existiert nur überprüft, ob der angegebene Schlüssel (oder Feld) im Dokument vorhanden ist.
NEIN!!!!! Getestet habe ich mit mongodb 2.4.3, und es VERWENDET den index. Beachten Sie, dass nicht vorhandene Felder haben den Wert Null im index.
MongoDB 3.0.3:
explain
für beidefind({field: {$exists: 1}})
undfind({field: {$ne: null}})
wie es aussieht, wird der index, sondern in der Erwägung, dass die zweite Abfrage endet sofort, die ersten stucks (w/ full-scan, denke ich).Gut, das saugt. Die Tasten sind Daten und sollte in der Lage sein, um indiziert werden. So dass Objekte als Daten irgendwie saugt, wenn Sie nicht indizieren kann Sie..
$exists
verwendet index nun (getestet auf mongo 3.2)InformationsquelleAutor RameshVel
$existiert, wird nicht der index, sondern Sie können Ihre Daten ändern-Struktur
und verwenden Sie dann
erstellen-index für die photo-id.
Es scheint, ich bin falsch, in der Tat, können Sie erzwingen, dass Ihre $exists-Abfrage, um die Nutzung Ihres index.
Lassen Sie uns gehen Sie auf die Verwendung der oben beschriebenen Struktur, aber Ihre Foto-id wird sicherlich nicht enthalten , das heißt
einige docs wird der Schlüssel 'id' und einige nicht. Dann können Sie erstellen sparse-index:
klicken Sie dann Fragen wie diese:
können Sie hinzufügen, erklären zu sehen, wenn die Abfrage den index.
Hier ist mein Ergebnis, meine Sammlung mobiler Schlüssel ist ähnlich wie Ihre Fotos.id:
Hoffe auf Hilfe!
$exists
verwendet index nun (getestet auf mongo 3.2)InformationsquelleAutor jianpx
Da MongoDB 2.0
$exists
Abfragen sollten einen index verwenden. Leider ist dieser fix hat verschwunden in der neuesten version und wird behoben werden in MongoDB 2.5InformationsquelleAutor H6.