Come posso creare query insensibili alle maiuscole e minuscole su Mongodb?

var thename = 'Andrew'; db.collection.find({'name':thename}); 

Come faccio a interrogare senza distinzione tra maiuscole e minuscole? Voglio trovare risultato anche se “Andrew”;

La soluzione di Chris Fulstow funzionerà (+1), tuttavia potrebbe non essere efficiente, specialmente se la tua collezione è molto grande. Le espressioni regolari non radicate (quelle che non iniziano con ^ , che ancorano l’espressione regolare all’inizio della stringa) e quelle che usano il flag i per l’insensibilità del maiuscolo non useranno gli indici, anche se esistono.

Un’opzione alternativa che potresti considerare è denormalizzare i tuoi dati per memorizzare una versione minuscola del campo del name , ad esempio come name_lower . Puoi quindi eseguire una query in modo efficiente (specialmente se è indicizzata) per le corrispondenze esatte maiuscole e minuscole come:

 db.collection.find({"name_lower": thename.toLowerCase()}) 

Oppure con una corrispondenza prefissata (un’espressione regolare con radice) come:

 db.collection.find( {"name_lower": { $regex: new RegExp("^" + thename.toLowerCase(), "i") } } ); 

Entrambe queste query useranno un indice su name_lower .

Dovresti usare un’espressione regolare insensibile alle maiuscole per questo, es

 db.collection.find( { "name" : { $regex : /Andrew/i } } ); 

Per utilizzare il modello regex dalla variabile thename , costruisci un nuovo object RegExp :

 var thename = "Andrew"; db.collection.find( { "name" : { $regex : new RegExp(thename, "i") } } ); 

Aggiornamento: per la corrispondenza esatta, è necessario utilizzare il "name": /^Andrew$/i regex "name": /^Andrew$/i . Grazie a Yannick L.

L’ho risolto in questo modo.

  var thename = 'Andrew'; db.collection.find({'name': {'$regex': thename,$options:'i'}}); 

Se si desidera eseguire una query in “corrispondenza esatta senza distinzione tra maiuscole e minuscole”, è ansible procedere in questo modo.

 var thename = '^Andrew$'; db.collection.find({'name': {'$regex': thename,$options:'i'}}); 

Ho appena risolto questo problema poche ore fa.

 var thename = 'Andrew' db.collection.find({ $text: { $search: thename } }); 
  • La sensibilità maiuscola e la sensibilità diacritica sono impostate su false di default quando si eseguono le query in questo modo.

Puoi anche espandere ciò selezionando i campi necessari dall’object utente di Andrew in questo modo:

 db.collection.find({ $text: { $search: thename } }).select('age height weight'); 

Riferimento: https://docs.mongodb.org/manual/reference/operator/query/text/#text

MongoDB 3.4 ora include la possibilità di creare un indice senza distinzione tra maiuscole e minuscole, che aumenterà notevolmente la velocità delle ricerche senza distinzione tra maiuscole e minuscole in insiemi di dati di grandi dimensioni. È fatto specificando una collazione con una forza di 2.

Probabilmente il modo più semplice per farlo è impostare una collation sul database. Quindi tutte le query ereditano le regole di confronto e la useranno:

 db.createCollection("cities", { collation: { locale: 'en_US', strength: 2 } } ) db.names.createIndex( { city: 1 } ) // inherits the default collation 

Puoi anche farlo in questo modo:

 db.myCollection.createIndex({city: 1}, {collation: {locale: "en", strength: 2}}); 

E usalo in questo modo:

 db.myCollection.find({city: "new york"}).collation({locale: "en", strength: 2}); 

Ciò restituirà città denominate “New York”, “New York”, “New York”, ecc.

Per maggiori informazioni: https://jira.mongodb.org/browse/SERVER-90

La seguente query troverà i documenti con la stringa richiesta in modo insensibile e con occorrenza globale

 db.collection.find({name:{ $regex: new RegExp(thename, "ig") } },function(err, doc) { //Your code here... }); 

Per trovare una stringa letterale insensibile alle maiuscole e alle minuscole:

Uso di regex (consigliato)

 db.collection.find({ name: { $regex: new RegExp('^' + name.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&') + '$', 'i') } }); 

Utilizzo dell’indice in minuscolo (più veloce)

 db.collection.find({ name_lower: name.toLowerCase() }); 

Le espressioni regolari sono più lente delle stringhe letterali. Tuttavia, un campo minuscolo aggiuntivo aumenterà la complessità del codice. In caso di dubbio, usa le espressioni regolari. Suggerirei di usare solo un campo esplicitamente minuscolo se può sostituire il tuo campo, cioè, non ti importa del caso, in primo luogo.

Nota che dovrai sfuggire al nome prima della regex. Se desideri i caratteri jolly di input dell’utente, preferisci .replace(/%/g, '.*') Dopo l’escaping in modo che sia ansible trovare “a%” per trovare tutti i nomi che iniziano con ‘a’.

È ansible utilizzare indici insensibili alle maiuscole / minuscole :

Nell’esempio seguente viene creata una raccolta senza regole di confronto predefinite, quindi viene aggiunto un indice nel campo del nome con regole di confronto senza distinzione tra maiuscole e minuscole. Componenti internazionali per Unicode

 /* * strength: CollationStrength.Secondary * Secondary level of comparison. Collation performs comparisons up to secondary * differences, such as diacritics. That is, collation performs comparisons of * base characters (primary differences) and diacritics (secondary differences). * Differences between base characters takes precedence over secondary * differences. */ db.users.createIndex( { name: 1 }, collation: { locale: 'tr', strength: 2 } } ) 

Per utilizzare l’indice, le query devono specificare le stesse regole di confronto.

 db.users.insert( [ { name: "Oğuz" }, { name: "oğuz" }, { name: "OĞUZ" } ] ) // does not use index, finds one result db.users.find( { name: "oğuz" } ) // uses the index, finds three results db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 2 } ) // does not use the index, finds three results (different strength) db.users.find( { name: "oğuz" } ).collation( { locale: 'tr', strength: 1 } ) 

oppure puoi creare una raccolta con regole di confronto predefinite:

 db.createCollection("users", { collation: { locale: 'tr', strength: 2 } } ) db.users.createIndex( { name : 1 } ) // inherits the default collation 

Un modo semplice sarebbe utilizzare $ toLower come di seguito.

 db.users.aggregate([ { $project: { name: { $toLower: "$name" } } }, { $match: { name: the_name_to_search } } ])