2016-04-14 4 views
1

Я ищу логику для извлечения данных из базы данных из записей 1000s. Я не могу делать на уровне приложений.Поиск регулярного выражения MongoDB с Array

У меня есть данные с окончанием двух двухбуквенных букв типа «ll, gg, ss, ff ...». хочет получить слова, которые заканчиваются вышеуказанными двойными символами из БД.

Мой образец 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', 'сс'];

Любая идея о том, как это сделать, как уровень БД. Захват уровня приложения достигает максимума и занимает больше времени, так как он имеет почти 100 тыс. Записей.

ответ

2

Вы можете use the $in with regular expression путем создания нового массива RegExp объектов для использования с выражением $in следующим образом:

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

Имейте в виду, что использование $in может быть довольно эффективным с небольшими массивами но не так хорошо с огромными списками, поскольку он будет пропускать в индексе, чтобы найти соответствующие документы, или пройти через всю коллекцию, если нет индекса для использования.


Кроме using the $in with the regular expression, Вы можете использовать $regex оператора а с трубкой разделителем шаблон регулярного выражения, содержащего checkarray так:

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

Для согласования двух последних символов, используйте следующий шаблон , т.е. добавить $ к шаблону, где метасимвол $ обозначает конец строки. Например, шаблон abc$ может соответствовать следующим abc, endsinabc, 123abc, ....

Таким образом, для последующего вопроса

Мне нужны слова, которая оканчивающиеся букв checkArray, а не в середине или начиная. Символы CheckArray должны быть в конце буквы строки. как «ЯЙЦО» не «наполняться»

вы можете идти об этом так:

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

Чтобы проверить это, заполнить эти образцы документов для проверки коллекции:

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

выше запрос вернет документы с _id с 1 и 3.

{ "_id" : 1, "word" : "well" } 
{ "_id" : 3, "word" : "glass" } 
+0

Потрясающие. Хорошо работать Спасибо за ваш быстрый ответ. небольшой изменение. Мне нужны слова, которые заканчиваются буквами checkArray в середине или начинаются. Символы CheckArray должны заканчиваться буквой строки. как «EGG», а не «ЗАПОЛНЕН», ища помощи[email protected] –

+0

@ user1099855 Я обновил свой ответ с решением для этого требования. – chridam

+0

Отлично, отлично работает –