2012-06-10 5 views
5

У меня есть довольно большой MongoDB, из которого мне нужно извлечь статистику, и я делаю эту покупку, выполняя запрос на уменьшение карты.MongoDB map уменьшить с запросом

Проблема теперь, что мне нужно, чтобы сузить запрос, чтобы использовать, например, статус:. «Записан» вместо того, чтобы использовать всю коллекцию

Это мой Map/Reduce код (я использую CodeIgniter): Я пытался следовать за последним шагом в этом запросе, но я не могу получить результаты, так что я думаю, что добавить синтаксис неправильно:. http://cookbook.mongodb.org/patterns/unique_items_map_reduce/

$map = new MongoCode ("function() { 

       day = Date.UTC(this.created_at.getFullYear(), this.created_at.getMonth(), this.created_at.getDate()); 

       emit ({day: day, _id: this._id}, {created_at: this.created_at, count: 1}); 

      }"); 

      $reduce = new MongoCode ("function(key , values) { 

       var count = 0; 

       values.forEach (function(v) { 

        count += v['count']; 

       }); 

       return {count: count}; 

      }"); 

      $outer = $this->cimongo->command (array (

       "mapreduce" => "documents", 

       "map"  => $map, 

       "reduce" => $reduce, 

       "out"  => "stats_results" 

      )); 


      $map = new MongoCode ("function() { 

       emit(this['_id']['day'], {count: 1}); 

      }"); 

      $reduce = new MongoCode ("function(key , values) { 

       var count = 0; 

       values.forEach (function(v) { 

        count += v['count']; 

       }); 

       return {count: count}; 

      }"); 

      $outer = $this->cimongo->command (array (

       "mapreduce" => "stats_results", 

       "map"  => $map, 

       "reduce" => $reduce, 

       "out"  => "stats_results_unique" 

      )); 
+0

Что вы имеете в виду "статус использования 'разработан'"? Не хотите ли вы отображать полную таблицу, или это достаточно, только испуская ключи с этим статусом? Я предполагаю, что вы хотите условно испустить результат, основанный на поле статуса. – evnu

ответ

1

Вы можете использовать rock mongo или mongo3, чтобы получить подробную статистику и результаты о карте/уменьшить или индексы.

I preffer rock_mongo, имеет больше возможностей.

12

Две вещи о вашем вопросе:

1) Пример в поваренной книге может быть немного слишком сложным для того, что вы пытаетесь сделать. Вот более простой:

Учитывая структуру документа, который выглядит следующим образом:

{ 
    "url" : "http://example.com/page8580.html", 
    "user_id" : "Jonathan.Clark", 
    "date" : ISODate("2012-06-11T10:59:36.271Z") 
} 

Ниже приведен пример JavaScript-код для запуска карты/уменьшить работу, которая будет рассчитывать количество посещений в отчетливой URL.

// Map function: 

map = function() { 
    emit({ url: this.url }, {count: 1}); 
} 

// Reduce function: 

reduce = function(key, values) { 
    var count = 0; 

    values.forEach(
    function(val) { count += val['count']; } 
    ); 

    return {count: count}; 
}; 

// Run the Map/Reduce function across the 'pageviews' collection: 
// Note that MongoDB will store the results in the 'pages_per_day' 
// collection because the 'out' parameter is present 

db.pageviews.mapReduce( 
    map,  // pass in the 'map' function as an argument 
    reduce,  // pass in the 'reduce' function as an argument 
    // options 
    { out: 'pages_per_day',  // output collection 
     verbose: true }  // report extra statistics 
); 

2) Если вы хотите запустить Map/Reduce функции только подмножество коллекции «PageViews», вы можете указать запрос для вызова «MapReduce()», чтобы ограничить число документов, что "карта() функция будет работать на:

// Run the Map/Reduce function across the 'pageviews' collection, but 
// only report on the pages seen by "Jonathan.Clark" 

db.pageviews.mapReduce( 
    map,  // Use the same map & reduce functions as before 
    reduce,  
    { out: 'pages_per_day_1user',  // output to different collection 
     query:{ 'user_id': "Jonathan.Clark" }  // query descriptor 
     verbose: true }  
); 

Обратите внимание, что если вы не используете JavaScript, вы должны перевести эти вызовы на любой язык программирования вы используете.

3) Вот пример вызова Map/Reduce функции с условием запроса с помощью PHP:

$outer = $this->cimongo->command (array (
       "mapreduce" => "pageviews", 
       "map"  => $map, 
       "reduce" => $reduce, 
       "out"  => "pages_per_day_1user", 
       "query"  => array("user_id" => "Jonathan.Clark") 
      )); 

4) Для получения дополнительной информации о Map/Reduce см следующие ссылки:

+0

Параметр запроса - это то, что я ищу, однако можно ли запросить массив значений? например, в find() я использую что-то вроде _id: {$ in: [1,2,3,4]} – abritez

+0

Параметр 'query' содержит документ, который описывает произвольный запрос MongoDB; вы можете использовать любой допустимый синтаксис, который вам нравится в этом поле. –

Смежные вопросы