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

Optimale sammensatte indekser for $ eksisterer:sand (sparsomme indekser)

Hvad du tilsyneladende ikke forstår her er, at $exists kan ikke "gribe" et indeks på nogen måde, selv hvor sparsomt. Som dokumentationen selv siger:

Eksemplet på disse sider er en { "$exists": false } forespørgsel. Men den omvendte logiske betingelse gør ikke nogen forskel her.

For at få det "fulde udbytte" af et "sparsomt" indeks, skal du overveje den "type" data, det indeholder, og forespørge på passende vis.

For numerisk noget som:

db.collection.find({ "a": "foobar", "b": { "$gte": -9999, "$lte": 9999 } })

Som bruger et indeks, og det sparsomme. Eller for tekstbaseret:

db.collection.find({ "a": "foobar", "b": /.+/ })

Som også vil bruge det sparsomme indeks og kun se på dem, hvor "b" blev defineret.

For "arrays" så "vær forsigtig". Da den værdi, der kigges på, sandsynligvis er en af ​​ovenstående, medmindre du gjorde dette:

db.collection.insert({ "a": 1, "b": [[]] })

Hvor så er det i orden:

db.ab.find({ "a": 1, "b": { "$type": 4 } })

Men kommer egentlig heller ikke til at bruge "sparse" indekset af de samme grunde $exists virker ikke her.

Så du skal forstå, hvad begreberne betyder her, og "forespørge passende" for at bruge de indeksdefinitioner, du opretter, hvis du forventer den maksimale ydeevne.

Dette er klare eksempler, du selv kan teste og se, at resultaterne er sande. Jeg ville ønske, at kernedokumentationen var klarere på disse punkter, men jeg er også klar over, at mange har forsøgt at bidrage (og har produceret fremragende forklaringer), men ingen af ​​disse er blevet inkluderet til dato.

Det er vel derfor, du spørger her.




  1. MongoDB:Hvordan sletter man alle poster i en samling i MongoDB Shell?

  2. Hvorfor gridfs get virker ikke på fil-id (ObjectId) kun efter filnavn

  3. Eksempel på tilpasset begivenhedslytter i Grails-dokumentation

  4. Hvordan laver man ikke-CRUD og ikke-grundlæggende MongoDB-kommandoer i ObjCMongoDB?