карта mongodb испускает ключи из поддокумента - PullRequest
2 голосов
/ 10 февраля 2012

У меня есть документ с вложенным документом:

{
    "_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 ]

3 голосов
/ 10 февраля 2012

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

    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);
            }
        }
    }
0 голосов
/ 10 февраля 2012

Это потому, что this.SearchTerms - это словарь / поддокумент, а не массив. this.SearchTerms[0] не существует.

По второму вопросу: что-то вроде этого должно работать:

for (key1 in this.SearchTerms)
{
  for (key2 in this.SearchTerms)
  {       
    if (key1 < key2)
    {
      key = [key1, key2];
      emit(key, 1);
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...