短版:我需要得到匹配/web/
不同的标签或任何其他条款的数组对于这个问题,出了Posts
收藏。“自动完成”标签与MapReduce的
我对执行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
对象ID引用到另一个集合中的post
id。
所有这些我变成了一个不同的应用程序来服务于不同的客户端。它原来是我特别需要的最佳解决方案。
我还没有想过,但也许这是最好的方法:使用'out:{merge:“tagIndexes”}'并实时查询。谢谢! – Roberto 2012-02-15 23:27:33
我最终做了一件完全不同的事情,但你的回答帮助我找到了Map/Reduce的一个很好的用法。谢谢! – Roberto 2012-02-23 08:56:22