2016-04-14 24 views
1

Veritabanından 1000s kayıtlardan veri almak için bir mantık arıyorum. Uygulama düzeyinde yapamam.MongoDB regex Array ile arama

"ll, gg, ss, ff ..." gibi iki çift harfi biten verilerim var. DB'den yukarıdaki ikiz karakterlerle biten kelimeleri almak istiyor.

My örnek DB:

[{ 
    "word": "Floss" 
    }, { 
    "word": "smacx" 
    }, { 
    "word": "fuzz" 
    }, { 
    "word": "grass" 
    }, { 
    "word": "dress" 
    }, { 
    "word": "puff" 
    }, { 
    "word": "cliff" 
    }, { 
    "word": "sniff" 
    }, { 
    "word": "chess" 
    }, { 
    "word": "kiss" 
    }, { 
    "word": "fell" 
    }, { 
    "word": "shell" 
    }] 

checkarray = [ll 'gg', ll, 'p'];

DB Düzeyi olarak nasıl yapılacağı hakkında bir fikir. Uygulama Seviyesi döngüsü, neredeyse 100k kayıtlara sahip olduğu için daha fazla zaman harcamaktadır.

cevap

2

Sen şöyle $in ifadesi ile kullanmak RegExp nesnelerin yeni bir dizi oluşturarak use the $in with regular expression yapabilirsiniz: akılda

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

Bear $in kullanarak küçük diziler oldukça verimli olabilir ama büyük listelerle o kadar iyi değil çünkü eşleme belgelerini bulmak için dizinde atlayacak ya da kullanılacak bir indeks yoksa tüm koleksiyonda yürüyecek.

var checkarray = ['ll','gg','ll','ss'], 
    regex = checkarray.join("|"); 
db.collection.find({ 
    "word": { 
     "$regex": regex, 
     "$options": "i" 
    } 
}) 

son iki karakter eşleştirmek için kullanın:


using the $in with the regular expression yanında Böyle checkarray içeren bir boru ayrılmış regex desenle bir $regex operatörünü kullanabilirsiniz aşağıdaki modelini izler, yani $ meta karakterinin bir dizgenin sonuna işaret ettiği desene $ ekler. Örneğin, abc$ modeli aşağıdaki abc, endsinabc, 123abc, ... ile eşleşebilir.

Yani, takip sorusu

için ben ortası değil yılında, checkArray mektubu biten ya başlıyor kelimeleri gerekir. CheckArray karakterleri, dizenin son harfi olmalıdır.

db.test.insert([ 
    { "_id": 1, "word" : "well" }, 
    { "_id": 2, "word" : "filled" }, 
    { "_id": 3, "word" : "glass" }, 
    { "_id": 4, "word" : "blessed" } 
]) 

üstü: koleksiyonunu test etmek,

var checkarray = ['ll','gg','ff','ss'], 
    regex = checkarray.map(function (k) { return new RegExp(k+'$'); }); 
db.collection.find({ 
    "word": { "$in": regex } 
}) 

Bunu sınamak için bu örnek belgeleri doldurmak: "YUMURTA"

böyle bu konuda gidebilir "DOLU" değil gibi sorgu, _id s 1 ve 3 ile belgeleri döndürecektir.

+0

Muhteşem. İyi çalışıyor Hızlı yanıtınız için teşekkürler. küçük değişim. Orta veya başlangıçta checkArray harflerinin biten sözcüklere ihtiyacım var. CheckArray karakterleri, dize sonu harfinde olmalıdır. yardım arayan "YUMURTA" değil "DOLU" [email protected] –

+0

@ user1099855 Cevabımı bu gereksinim için çözümle güncelledim. – chridam

+0

Mükemmel, İyi çalışıyor –