2016-04-15 37 views
5

Mongodb veritabanımda bir koleksiyon üzerinde arama yapmak istiyorum. koleksiyonuma, ben alanı "adıyla" ile belgeler var gibi değerler olabilir:MongoDB: büyük/küçük harfe duyarlı, aksan ve yüzde gibi mantığı yok eden belgeler nasıl bulunur (%)

[i] "Palácio Guanabara", "Palácio da Cidade", "Festa Palácio" vb

bir kullanıcı "pala" veya "palá" veya "Pala" veya "PalÁ" gibi bir arama yapar, sonuç kümesini oluşturmaları gerekir.

Ben MongoDB ben gibi aramalarda normal ifadeler kullanabilirsiniz bulmuşlardır:

{ "name": { $regex: new Regex(".*pala.*", "i") } } 

Tamam, bu yaklaşım duyarsız olduğu ve SQL ("% pala%") den mantık gibi yüzde kullanın. Ancak, veritabanındaki kayıttan gelen aksini dikkate almaz. https://docs.mongodb.org/manual/core/index-text/

Bu yaklaşım harf duyarlı ve aksan yok sayabilirsiniz:

Ben $ metin dizini ile başka bir alternatif bulundu. Ancak "arama" bir normal ifadeyi kabul etmiyor, bu yüzden "% pala%" gibi şeyler arayamıyorum. vb

select * from collection where remove_accents(upper(name)) like '%Pala%' 

Ve "Palacio", "palacio", "Palacio" gibi adıyla sonuçları döndürürken bu sorguyu,

+1

Burada önerildiği gibi http: // stackoverflow.com/questions/7707671/mongodb-match-accented-character-as-underlying-character-olası-olası en iyi bahsiniz, aranabilir bir dizgenin kesintisiz bir versiyonunu içeren bir alan yaratmaktır. – joao

+0

Teşekkürler @joao. Dmitriy yaklaşımını kullanacağım ve gelecekte bu dosyaya "aranabilir" oluşturacağım. –

cevap

1
:

özetliyor, MongoDB aşağıdaki SQL sorgusu yapmak istiyorum

MongoDb'nin içinde sihirli bir mermi yok. Ancak, '% pala%' oluşturmak için kullanıcı girdisini zaten değiştirdiğinizden, neden "a" yerine "[aá]" ile yer değiştirip ". *" Ifadesini kullanmayın, bu şekilde regex'i kullanabilir ve aksanlarınızı alabilirsiniz.

Buradaki seçenekler, yer değiştirmek için fazla çalışmaz.

Fransız Mektupları [a-zA-ZàâäôéèëêïîçùûüÿæœÀÂÄÔÉÈËÊÏΟÇÙÛÜÆŒ]

Alman Harfler şimdi unicode dahil ß tartışmalı harf, bir soru işareti olarak ekranda gösterebilir, böylece bir çok yazı tipinde eksik . [a-z-ZäöüßÄÖÜẞ]

Polonya Letters [a-pr-uwy-z-PR-UWY-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ] Q, Polonya V ve X olduğunu not edin. siz de tüm İngilizce harfler izin vermek istiyorsanız, gelen [a-zA-ZąćęłńóśźżĄĆĘŁŃÓŚŹŻ]

İtalyan Mektupları [a-zA-ZàèéìíîòóùúÀÈÉÌÍÎÒÓÙÚ]

İspanyol Mektupları [a-zA-ZáéíñóúüÁÉÍÑÓÚÜ] kullanmak

find({name: {$regex: 'pala', $options: "i"}}) 

size: sadece kullanırsanız ne http://www.rexegg.com/regex-interesting-character-classes.html#languages

+0

Yardımlarınız için teşekkürler. Bu andaki problemimi çözmek için bu yaklaşımı kullanacağım. Çalışır, bu yararlı işlevi bu [post] 'da kullandım (http://stackoverflow.com/a/5700735/6209115) –

8

geçerli yapıcısı geçerli olmayan new Regex() kullanılmış geçerli kurucu new RegExp()