MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

$elemmatch ne fonctionne pas dans MongoDB

Cela n'aurait pas dû fonctionner du tout dans les versions antérieures, car à tout le moins vous avez modifié la portée de this pour faire maintenant référence aux "données" en tant qu'élément de niveau supérieur. En bref, cela n'est plus autorisé et vous ne devriez vraiment pas utiliser de méthodes JavaScript à moins que vous ne le deviez absolument. Même dans ce cas, il existe probablement encore un meilleur moyen dans la plupart des cas.

Mais en fait, il s'agit d'une utilisation inutile de la correspondance JavaScript car elle n'est pas requise lorsqu'il existe d'autres opérateurs qui le feront.

Vous devriez utiliser un $regex formulaire à la place :

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

Ou n'importe où dans le champ, supprimez le caret ^ :

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

Ce qui est à peu près aussi inefficace que l'exécution de JavaScript, mais pas autant qu'il n'y a pas de surcharge de traitement via ce moteur d'interpréteur. Et bien sûr, cela fonctionne partout.

Pensez également à ce que fait réellement une requête reposant sur JavaScript :

  • Invoque une instance d'interpréteur JavaScript
  • Convertit les types de documents BSON par document en types JavaScript
  • Évalue le code JavaScript dans l'interpréteur par document
  • Transmet JavaScript true|false retour en conséquence par document

Considérant que $regex (mais avec une correspondance insensible à la casse qui n'est pas optimale) fait les mêmes opérations mais en utilisant nativement la bibliothèque C "pcre" sans conversion ni refonte par document, alors c'est clairement le choix sensé des deux.