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

$elemmatch non funziona in MongoDB

Non avrebbe dovuto funzionare affatto nelle versioni precedenti, poiché almeno hai modificato l'ambito di this per ora fare riferimento ai "dati" come elemento di primo livello. In breve, questo non è più consentito e non dovresti davvero usare i metodi JavaScript a meno che tu non sia assolutamente necessario. Anche in questo caso, nella maggior parte dei casi c'è probabilmente ancora un modo migliore.

Ma in realtà si tratta di un uso non necessario della corrispondenza JavaScript in quanto non è richiesta quando esistono altri operatori che lo faranno.

Dovresti utilizzare un $regex form invece:

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

O in qualsiasi punto del campo, rimuovi il cursore ^ :

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

Il che è praticamente inefficiente come l'esecuzione di JavaScript, ma non tanto quanto non c'è il sovraccarico dell'elaborazione attraverso quel motore di interprete. E ovviamente funziona ovunque.

Pensa anche a cosa sta effettivamente facendo una query che si basa su JavaScript per la risoluzione:

  • Richiama un'istanza dell'interprete JavaScript
  • Converte i tipi di documento BSON per documento in tipi JavaScript
  • Valuta il codice JavaScript nell'interprete per documento
  • Trasmette JavaScript true|false come risultato per documento

Considerando che $regex (ma con una corrispondenza senza distinzione tra maiuscole e minuscole che non è ottimale) sta facendo le stesse operazioni ma usando la libreria C "pcre" in modo nativo senza conversione e rifusione per documento, quindi è chiaramente la scelta sana dei due.