Короткая версия : мне нужно получить массив различных тегов, соответствующих /web/
или любому другому термину по этому вопросу, из коллекции Posts
.
У меня есть сомнения по поводу реализации шаблона MapReduce для подачи в поле «автозаполнение».Считаете ли вы, что это лучший подход?
Моя коллекция Posts
содержит документы, такие как:
{
'title': 'A great post',
'tags': ['web2.0', 'monetize', 'cloud', 'someOtherDumbTerm']
}
{
'title': 'Another great post',
'tags': ['monetize', 'seo-optimization', 'web3.0']
}
При таком поиске, как /web/
, у меня были бы такие результаты: ["web2.0", "web3.0"]
Моя функция MapReduce выглядит следующим образом:
var mapFn = function(){
if( this.tags ){
this.tags.forEach(function(value){
if (value.match(/web/i)){
emit('web', value);
}
});
}
};
var reduceFn = function(key, values){
return {result:values};
};
db.runCommand({
mapreduce: 'posts',
out: {inline:1},
map: mapFn,
reduce: reduceFn,
query: {tags:/web/}
});
Я думаю о сохранении тегов в другой коллекции и просто выполняю их регулярный поиск, но мне кажется, чторудиментарная интуиция, оставленная годами обучения RDBMS.Я также не имею представления о производительности или других последствиях для таких запросов, и документация, по-видимому, не очень полезна для этого случая.
Спасибо!
Что я закончилдо выполнения
Я фактически только использовал MapReduce для аналитики указанных тегов.
Я храню их описанным способом, но в другой коллекции, стараясь нормализовать его до базового ASCII (т.е.акценты и тому подобное) для поиска по регулярному выражению, а также для сохранения первоначальных терминов.Затем я ссылаюсь на идентификатор объекта tag
на идентификатор post
в другой коллекции.
Все это я превратил в другое приложение для обслуживания разных клиентов.Это оказалось лучшим решением для моей конкретной потребности.