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

$elemmatch virker ikke i MongoDB

Det burde slet ikke have fungeret i tidligere versioner, da du i det mindste har ændret omfanget af this for nu at henvise til "data" som et element på øverste niveau. Kort sagt, dette er ikke længere tilladt, og du bør virkelig ikke bruge JavaScript-metoder, medmindre du absolut er nødt til det. Selv da er der nok stadig en bedre måde i de fleste tilfælde.

Men faktisk er dette en unødvendig brug af JavaScript-matching, da det ikke er påkrævet, når der findes andre operatører, der vil gøre dette.

Du skal bruge en $regex formular i stedet:

db.docs.find({ "data.First_name": /^kim/i })

Eller hvor som helst i feltet, fjern indtegningen ^ :

db.docs.find({ "data.First_name": /kim/i })

Hvilket er stort set lige så ineffektivt som JavaScript-udførelse, men ikke så meget, som der ikke er overhead ved behandling gennem den fortolkermotor. Og det virker selvfølgelig overalt.

Tænk også på, hvad en forespørgsel, der er afhængig af JavaScript til at løse, rent faktisk gør:

  • Påkalder en JavaScript-fortolkningsinstans
  • Konverterer BSON-dokumenttyper pr. dokument til JavaScript-typer
  • Evaluerer JavaScript-kode i tolken pr. dokument
  • Casts JavaScript true|false tilbage som resultat pr. dokument

I betragtning af at $regex (men med et match uafhængigt af store og små bogstaver, som ikke er optimalt) udfører de samme operationer, men bruger "pcre" C-biblioteket indbygget uden konvertering og recasting pr. dokument, så er det klart det fornuftige valg af de to.




  1. Sådan holder Redis-serveren kørende

  2. Kontroller, om feltet findes i et underdokument til et array

  3. Redis-transaktioner og langvarige Lua-scripts

  4. MongoDB $inc