2012-05-22 10 views
13

Czy można w dowolny sposób przeszukać kolumnę w kolekcji w mongodb z $ in, która zawiera tablicę elementów do wyszukiwania, a także dopasowanie Niewrażliwe na przypadek tych elementów w kolumnie?

+0

Oprócz operatora $ in, jest to duplikat http://stackoverflow.com/questions/1863399/mongodb-is-it-possible-to-make-a-case-insensitive-query –

+0

Dobrze. moje pytanie było zasadniczo związane z dopasowaniem wielkości liter do operatora $ in. –

Odpowiedz

6

Możesz użyć $ elemMatch do wyszukiwania wyrażeń regularnych, np. niech szukać „niebieski” kolor w tej kolekcji:

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

Jedna uwaga: to wyrażenie nie będzie używać indeksu. Takie rozwiązanie nie pasuje do "dużych zbiorów danych". Innym rozwiązaniem jest obsługa tej samej tablicy z małymi literami. –

+0

Rzeczywiście. Dziękuję, że o tym wspomniałeś. –

+1

nie jest to użyteczne, gdy musimy sprawdzić tablicę wartości –

0

Oto moja sprawa niewrażliwe wyszukiwania (zapytanie) z wieloma warunek (regex) z danymi z tablicy, Użyłem $in ale nie obsługuje wyszukiwania niewrażliwego na wielkość liter.

Przykład Dane

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

Moje zapytanie

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

Zastosowanie $in ze mecz jest wielkość liter ma znaczenie:

przykład

danych:

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

I chcemy Docu mentów były „fieldX” jest zawarta w każdej wartości macierzy (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 } }); 

działa na $all albo.

Mam nadzieję, że to pomoże!

p.s .: To było moje rozwiązanie do wyszukiwania według tagów w aplikacji internetowej.

+0

, która działała dla potrzeb Ruby, a także dzięki .. użyłem 'Regexp.new (opt, Regexp :: IGNORECASE)' zamiast 'nowego RegExp (tag, "i") ' –

1

To działa na mnie idealnie: z kodu możemy tworzyć własne zapytanie tak:

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

ta przekształci się idąc w Mongo po zapytaniu:

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

samo dla „$ nin ".