Запустить карту / уменьшить коллекцию MongoDb с условиями - PullRequest
1 голос
/ 24 октября 2011

Мое понимание карты / уменьшения кажется недостаточным. Интересно, смогу ли я выбрать подмножество документов из коллекции, запустить карту и сократить функции только для этого подмножества.

Возможно ли это вообще?

В противном случае это означало, что вся фильтрация должна быть выполнена в функции карты перед генерацией. Я уже написал карту для моего варианта использования:

map = <<-EOF
  function(){
    Array.prototype.contains = function(obj) {
      var i = this.length;
      while (i--) {
        if (this[i] === obj) {
          return true;
        }
      }
      return false;
    };

    project_ids = ['#{@project_ids.map{|pid| pid.to_s}.join('\',\'')}'];

    if(project_ids.contains(this.project_id.toString())) {
      if(this.time.getFullYear() == '#{@year}' && this.time.getMonth() == '#{@month.to_i - 1}') {
        emit(
          this.time.getDate(),
          {
            foos: this.stats.foos
          }
        );
      }
    }
  };
EOF

Это часть проекта Rails, и метод, реализованный с использованием map / проводить, на самом деле в 3 раза медленнее, чем чистый метод ruby.

Поэтому мне интересно, есть ли возможность сначала отфильтровать мой набор записей, применяя некоторые условия, а затем запустить подмножество записей с помощью map / lower для получения моих данных.

Может ли кто-нибудь просветить меня? Спасибо заранее Felix

Ответы [ 2 ]

3 голосов
/ 24 октября 2011

Есть. Одним из параметров функции map / Reduce является «запрос», который позволяет именно то, что вам нужно. Посмотрите подробности http://www.mongodb.org/display/DOCS/MapReduce.

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

Если вы используете ORM, то вы часто можете получить селектор из коллекции с областью действия и использовать его в map-Reduce, например, с монгоидом:

scoped = Project.active.this_year
Project.collection.map_reduce( ..., :query => scoped.selector)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...