2011-03-31 24 views

Respuesta

23

Suponga que tiene documento que contiene tag campo y que desea buscar en ella

Tags 
{ 
    tag, 
    ... 
} 

La primera opción es el uso de expresiones regulares (pero trabajar lenta como dijo @RestRisiko):

db.tags.find({ "tag" : { "$regex" : "C#", "$options" : "-i" } }) 

La segunda opción es crear otro campo en minúsculas (y en mongodb de la mejor manera):

Tags 
{ 
    tag, 
    tagLower, 
    .. 
} 

Y el uso de find como de costumbre:

db.tags.find({ "tagLower" : "c#"}) 

va a trabajar más rápido, ya que el código anterior se puede utilizar el índice para la búsqueda.

+0

No funcionará si la etiqueta contiene signo de interrogación. –

8

Tiene que normalizar los datos que se consultarán. Usar una expresión regular para búsqueda insensible a mayúsculas/minúsculas podría funcionar también y no usará índices. Entonces, tu única opción es normalizar. Si necesita preservar el estado original, necesita desnormalizar los datos y almacenar los valores normalizados en una columna dedicada del documento.

+0

+1 por la respuesta correcta, acabo de agregar un ejemplo en mi respuesta. –

2

Al usarlo con Node.js, es mejor crear un objeto RegEx en la consulta.

Room.findOne({'name': new RegExp(roomName, 'i')}, {}, function(err, room) { 
... 
0

Use expresiones regulares que coincidan con las de abajo. La 'i' muestra insensibilidad a mayúsculas y minúsculas.

var collections = mongoDatabase.GetCollection("Abcd"); 

var queryA = Query.And(
     Query.Matches("strName", new BsonRegularExpression("MSID", "i")), 
     Query.Matches("strVal", new BsonRegularExpression("154800", "i"))); 

var queryB = Query.And(
     Query.Matches("strName", new BsonRegularExpression("Operation","i")), 
     Query.Matches("strVal", new BsonRegularExpression("8221", "i"))); 

var getA = collections.Find(queryA); 
var getB = collections.Find(queryB); 
Cuestiones relacionadas