【发布时间】:2012-07-17 08:34:43
【问题描述】:
短版:我需要从Posts 集合中获取与/web/ 或任何其他术语匹配的不同标签的数组。
我对实施 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。
所有这些我都变成了一个不同的应用程序来服务不同的客户。事实证明,它是满足我特殊需求的最佳解决方案。
【问题讨论】:
标签: mongodb mapreduce database-schema