的帮助
这是因为
我有一个文档,其中包括一个子文档:
{
"_id" : ObjectId("XXXXX"),
"SearchKey" : "1234",
"SearchTerms" : {
"STA" : ["1"],
"STB" : ["asdfasdf"],
"STC" : ["another"]
}
}
SearchTerm元素不是固定的——例如,有时我们会有没有STC的STA。
我可以做到:
var map = function() {
for (key in this.SearchTerms)
{
emit(key, 1);
}
}
但我不能这样做:
var map = function() {
for (var i=0; i< this.SearchTerms.length; i++)
{
emit(this.SearchTerms[i], 1)
}
}
因为后者在reduce之后不会产生任何结果。为什么不呢?
顺便说一句,我需要做的是计算所有文档中搜索词的叉积,也就是说,在上面的情况下,找到(STA和STB)和(STA and STC)以及(STB和STC)的发生率。如果有人知道如何立即做到这一点,效果会更好。
一如既往,感谢
发出的键应该是两个键的组合。
var map = function() {
if(!this.SearchTerms) return;
for(var i = 0 ; i < this.SearchTerms.length; i++){
var outerKey = this.SearchTerms[i];
for(var j = i + 1; j < this.SearchTerms.length; j++){
var innerKey = this.SearchTerms[j];
// assuming you don't care about counting (STA and STC) separately from (STC and STA),
// then order doesn't matter, lets make sure both occurences have the same key.
var compositeKey = (outerKey < innerKey) ? outerKey+"_"+innerKey : innerKey+"_"+outerKey;
emit(compositeKey, 1);
}
}
}
this.SearchTerms
是字典/子文档,而不是数组。this.SearchTerms[0]
不存在。
对于第二个问题:像这样的东西应该有效:
for (key1 in this.SearchTerms)
{
for (key2 in this.SearchTerms)
{
if (key1 < key2)
{
key = [key1, key2];
emit(key, 1);
}
}
}