Карта 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.