sql >> Databasteknik >  >> NoSQL >> MongoDB

$elemmatch fungerar inte i MongoDB

Det borde inte alls ha fungerat i tidigare versioner, eftersom du åtminstone har ändrat omfattningen av this för att nu hänvisa till "data" som ett element på toppnivå. Kort sagt, detta är inte längre tillåtet och du borde verkligen inte använda JavaScript-metoder om du inte absolut måste. Även då finns det förmodligen fortfarande ett bättre sätt i de flesta fall.

Men i själva verket är detta en onödig användning av JavaScript-matchning eftersom det inte krävs när det finns andra operatörer som kommer att göra detta.

Du bör använda en $regex formulär istället:

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

Eller var som helst inom fältet, ta bort fältet ^ :

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

Vilket är i stort sett lika ineffektivt som JavaScript-exekvering men inte så mycket som det inte finns överkostnader för bearbetning genom den tolkmotorn. Och självklart fungerar det överallt.

Tänk också på vad en fråga som förlitar sig på JavaScript för att lösa faktiskt gör:

  • Anropar en JavaScript-tolkinstans
  • Konverterar BSON-dokumenttyper per dokument till JavaScript-typer
  • Utvärderar JavaScript-kod i tolken per dokument
  • Castar JavaScript true|false tillbaka som ett resultat per dokument

Med tanke på att $regex (men med en skiftlägesokänslig matchning som inte är optimal) gör samma operationer men använder "pcre" C-biblioteket inbyggt utan konvertering och omarbetning per dokument, då är det helt klart det förnuftiga valet av de två.




  1. Mongoose Virtuals i MongoDB Aggregate

  2. Mongodb gruppera efter fält med $substr

  3. Decimal / Flytande i mongoose för node.js

  4. MongoDB-uppslagsmatris av objekt efter fält (sammanfogningsvillkor och okorrelerade underfrågor)