2012-05-22 3 views
13

Est-il possible de rechercher une colonne dans une collection dans mongodb avec $ dans lequel inclut un tableau d'éléments pour la recherche et également la correspondance caseInsensible de ces éléments dans la colonne?

+0

En dehors de l'opérateur $ in, il s'agit d'un doublon de http://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case-insensitive-query –

+0

A droite. Ma question était fondamentalement liée à la correspondance caseinsensitive avec l'opérateur $ in. –

Répondre

6

Vous pouvez utiliser $ elemMatch avec la recherche d'expressions régulières, par ex. Cherchons pour « bleu » couleur dans la collection:

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

Une note: cette regex n'utilisera pas d'index. Donc, une telle solution ne convient pas pour les «big data». Une autre solution consiste à prendre en charge le même tableau en minuscules. –

+0

En effet. Merci d'avoir mentionné cela. –

+1

ce n'est pas utile lorsque nous avons besoin de vérifier un tableau de valeur –

0

Voici mon insensible à la casse recherche (requête) à condition multiple (regex) à partir des données de tableau, je l'ai utilisé $in mais ne prend pas en charge la recherche insensible à la casse.

Exemple de données

{ 
    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"] 
} 

Ma requête

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

Utilisez $in avec le match étant insensible à la casse:

Exemple de données:

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

Et nous voulons docu ments étaient "fieldX" est contenue dans une valeur du tableau (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 } }); 

Cela fonctionne pour $all non plus.

J'espère que cela aide!

p.s .: C'était ma solution pour rechercher par tags dans une application web.

+0

a travaillé pour Ruby besoins ainsi merci .. juste utilisé 'Regexp.new (opt, Regexp :: IGNORECASE)' à la place de 'new RegExp (tag, "je") ' –

1

Cela fonctionne pour moi parfaitement: De code que nous pouvons créer requête personnalisée comme ceci:

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

Cela transformera à suivre en mongo après requête:

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

Même chose pour « nin $ ".

Questions connexes