2012-05-22 14 views
13

¿Hay alguna manera de buscar en una columna de una colección en mongodb con $ en la que incluya una matriz de elementos para buscar y también coincidencias caseInsensitive de esos elementos en la columna?

+0

Aparte del operador $ in, este es un duplicado de http://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case-insensitive-query –

+0

Ya a la derecha. mi pregunta estaba relacionada básicamente con la coincidencia caseinsensitive con el operador $ in. –

Respuesta

6

Puede usar $ elemMatch con la búsqueda de expresiones regulares, p. Ej. vamos a la búsqueda para "azul" color en la colección siguiente:

db.items.save({ name : 'a toy', colors : ['red', 'BLUE'] }) 
> ok 
db.items.find({ 'colors' : 
        { $elemMatch : 
         { $regex : 'blue', $options : 'i' } 
        } 
       }) 
>[ 
    { "name" : "someitem", "_id" : { "$oid" : "4fbb7809cc93742e0d073aef" }, "colors" : [ "red", "BLUE" ] } 
] 
+2

Una nota: esta expresión regular no usará el índice. Entonces, esa solución no se ajusta a 'big data'. Otra solución es admitir la misma matriz en minúsculas. –

+0

De hecho. Gracias por mencionar eso. –

+1

esto no es útil cuando tenemos que verificar una matriz de valor –

0

Aquí es mi sensible a mayúsculas búsqueda (query) con la condición múltiple (expresiones regulares) a partir de datos de la matriz, que he usado $in pero no es compatible con la búsqueda insensible a mayúsculas y minúsculas.

Ejemplo datos

{ 
    name : "...Event A", 
    tags : ["tag1", "tag2", "tag3", "tag4] 
}, 
{ 
    name : "...Event B", 
    tags : ["tag3", "tag2"] 
}, 
{ 
    name : "...Event C", 
    tags : ["tag1", "tag4"] 
}, 
{ 
    name : "...Event D", 
    tags : ["tag2", "tag4"] 
} 

Mi consulta

db.event.find(
    { $or: //use $and or $or depends on your needs 
    [ 
     { tags : { 
     $elemMatch : { $regex : '^tag1$', $options : 'i' } 
     } 
     }, 
     { tags : { 
     $elemMatch : { $regex : '^tag3$', $options : 'i' } 
     } 
     } 
    ] 
}) 
4

Uso $in con el caso de ser insensibles partido:

Datos ejemplo:

{ 
    name : "...Event A", 
    fieldX : "aAa" 
}, 
{ 
    name : "...Event B", 
    fieldX : "Bab" 
}, 
{ 
    name : "...Event C", 
    fieldX : "ccC" 
}, 
{ 
    name : "...Event D", 
    fieldX : "dDd" 
} 

y queremos docu mentos eran "CampoX" está contenida en cualquier valor de la matriz (optValues):

var optValues = ['aaa', 'bbb', 'ccc', 'ddd']; 

var optRegexp = []; 
optValues.forEach(function(opt){ 
     optRegexp.push( new RegExp(opt, "i")); 
}); 

db.collection.find({ fieldX: { $in: optRegexp } }); 

Esto funciona para $all tampoco.

Espero que esto ayude!

p.s .: Esta fue mi solución para buscar por etiquetas en una aplicación web.

+0

también funcionó para las necesidades de Ruby. Solo usé 'Regexp.new (opt, Regexp :: IGNORECASE)' en lugar de 'nueva RegExp (tag, "yo") ' –

1

Esto funciona para mí perfectamente: De código podemos crear consultas personalizadas así:

{"first_name":{"$in":[{"$regex":"^serina$","$options":"i"},{"$regex":"^andreW$","$options":"i"}]}} 

Esto transformará al siguiente en mongo después de consulta:

db.mycollection.find({"first_name":{"$in":[/^serina$/i, /^andreW$/i]}}) 

Lo mismo para "$ Nin ".

Cuestiones relacionadas