Карта mongodb выделяет ключи из поддокумента

У меня есть документ, который включает вложенный документ:

{ "_id" : ObjectId("XXXXX"), "SearchKey" : "1234", "SearchTerms" : { "STA" : ["1"], "STB" : ["asdfasdf"], "STC" : ["another"] }
}

Элементы SearchTerm не фиксированы - иногда мы будем иметь STA без STC, например.

Я могу сделать это:

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) }
}

потому что последнее не дает никаких результатов после сокращения. Почему нет?

В качестве стороннего - то, что мне нужно сделать, - подсчитать кросс-продукт поисковых терминов по всем документам, то есть найти вероятность (STA и STB) и (STA и STC) и (STB и STC) в случае выше. Если кто-то знает, как это сделать сразу, это работает еще лучше.

Как всегда, спасибо за помощь

2 ответа

Ключ, который вы испускаете, должен быть составным для обоих ключей.

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); } }
}

licensed under cc by-sa 3.0 with attribution.