短版:我需要得到匹配/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