简短版:我需要从/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
对象ID引用到另一个集合中的post
id。
所有这些我变成了一个不同的应用程序来服务不同的客户。事实证明这是满足我特殊需求的最佳解决方案。
答案 0 :(得分:0)
我认为Map /将标签缩减为不同的集合听起来非常合理。
您无法实时运行Map / Reduce查询。并且您无法使用标准的“查找”查询来获取您希望从现有集合中获得的标记。如果您的标签自动完成系统不包含过去一小时或最后一天的新标签,或者您的MapReduce作业经常运行,您可能并不在意。