MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

$elemmatch funktioniert nicht in MongoDB

In früheren Versionen hätte es überhaupt nicht funktionieren sollen, da Sie zumindest den Geltungsbereich von this geändert haben um jetzt auf "Daten" als Element der obersten Ebene zu verweisen. Kurz gesagt, dies ist nicht mehr erlaubt und Sie sollten wirklich keine JavaScript-Methoden verwenden, es sei denn, Sie müssen es unbedingt tun. Selbst dann gibt es wahrscheinlich in den meisten Fällen noch einen besseren Weg.

Tatsächlich ist dies jedoch eine unnötige Verwendung des JavaScript-Abgleichs, da dies nicht erforderlich ist, wenn andere Operatoren vorhanden sind, die dies tun.

Sie sollten einen $regex Form statt:

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

Oder entfernen Sie an einer beliebigen Stelle innerhalb des Felds das Caretzeichen ^ :

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

Das ist ziemlich ineffizient wie die Ausführung von JavaScript, aber nicht so sehr, wie es nicht den Overhead der Verarbeitung durch diese Interpreter-Engine gibt. Und natürlich funktioniert es überall.

Denken Sie auch darüber nach, was eine Abfrage, die zur Auflösung auf JavaScript angewiesen ist, tatsächlich tut:

  • Ruft eine JavaScript-Interpreter-Instanz auf
  • Konvertiert BSON-Dokumenttypen pro Dokument in JavaScript-Typen
  • wertet JavaScript-Code im Interpreter pro Dokument aus
  • Wirkt JavaScript true|false zurück als Ergebnis pro Dokument

In Anbetracht dessen, dass $regex (aber mit einer Übereinstimmung ohne Berücksichtigung der Groß- und Kleinschreibung, die nicht optimal ist) die gleichen Operationen durchführt, aber die C-Bibliothek "pcre" nativ ohne Konvertierung und Neuformung pro Dokument verwendet, dann ist dies eindeutig die vernünftige Wahl der beiden.