MongoDB MapReduce: использовать позиционный оператор $ в функции карты - PullRequest
0 голосов
/ 01 июня 2011

У меня есть коллекция с записями, которые выглядят так:

{"userid": 1, "contents": [{"tag": "what", "value": 100}, {"tag ":" what2 "," value ": 110}]}

Я выполняю MapReduce для этой коллекции с запросами, такими как {" contents.tag ":" what "}.

То, что я хотел бы сделать в своей функции карты, - это создать поле «значение», соответствующее записи в массиве «содержимое», которая соответствует запросу , без необходимости перебирать весь массив .При обычных обстоятельствах я мог бы сделать это, используя оператор $ positional с чем-то вроде content. $. Value.Но в случае MapReduce это не работает.

Подводя итог, вот код, который у меня сейчас есть: `

map=function(){
        emit(this.userid, WHAT DO I WRITE HERE TO EMIT THE VALUE I WANT ?);
    }
    reduce=function(key,values){
        return values[0]; //this reduce function does not make sense, just for the example
    }
    res=db.runCommand(
    {
        "mapreduce": "collection",
        "query": {'contents.tag':'whatever'},
        "map": map,
        "reduce": reduce,
        "out": "test_mr" 
    }
    );`

Есть идеи?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 17 февраля 2013

Ни за что.У меня была такая же проблема.Итерация необходима.Вы можете сделать это:

map=function() {
  for(var i in this.contents) {
    if(this.contents[i].tag == "whatever") {
      emit(this.userid, this.contents[i].value);
    }
  } 
}
0 голосов
/ 02 июня 2011

Это не будет работать без перебора всего массива.В MongoDB запрос предназначен для соответствия всему документу.

При работе с Map / Reduce запрос просто обрезает количество документов, которые передаются в функцию map.Однако функция map не знает, какой запрос был выполнен.Они отключены.

Исходный код M / R: здесь .

Существует функция агрегации, которая будет более точно соответствовать этому желанию.Но у этой функции нет графика времени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...