Mapreeding для подсчета появления полей, которые могут или не могут существовать - PullRequest
1 голос
/ 01 июня 2011

Это дает мне ошибку {"assertion" => "Ошибка вызова карты: ошибка JS: ReferenceError: foo не определен nofile_b: 4". Есть идеи?

class ObjResults
  include Mongoid::Document

field :foo, :type => Boolean, :default => false 
field :bar, :type => Boolean, :default => false 

def self.stats_by_user_id user_id
 map = <<-MAP
 function() { 
    if (this.user_id == "#{user_id}") {   
        hsh = {}    
        if (this.foo) {
            hsh["foo"] = this.foo
            }
        if (this.bar) {
            hsh["bar"] = this.bar
        }
        emit(this.user_id, hsh);  
    }
} 
MAP 

Ответы [ 3 ]

1 голос
/ 01 июня 2011

Вам нужно поставить foo и bar в кавычки при назначении хешу:

hsh["foo"] = this.foo;  // or hsh.foo = this.foo

Возможно, вы захотите пометить этот вопрос как javascript, поскольку рубиновая часть минимальна.

0 голосов
/ 15 апреля 2013

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

командная строка:

2.0.0p0 :023 > Band.all.to_a.map(&:bar)
=> [false, false, true, false]
2.0.0p0 :024 > Band.all.to_a.map(&:foo)
=> [false, false, true, true]
2.0.0p0 :025 > Band.mar.to_a
=> [{"_id"=>"Apple", "value"=>{"likes"=>888.0, "hh"=>3.0}}, {"_id"=>"IBM", "value"=>{"likes"=>1431.0, "hh"=>0.0}}]

структура кода:

class Band
  include Mongoid::Document
  field :name, type: String
  field :likes, type: Integer, default: 0
  field :foo, type: Boolean, default: false
  field :bar, type: Boolean, default: false

  def self.mar
    map = %Q{
      function() {
        hsh = {};
        if(this.foo) {hsh.foo = this.foo}
        if(this.bar) {hsh.bar = this.bar}
        emit(this.name, { likes: this.likes, hh: hsh });
      }
    }

    reduce = %Q{
      function(key, values) {
        var result = { likes: 0, hh: 0 };
        values.forEach(function(value) {
          result.likes += value.likes;
          if(value.hh.foo) {result.hh += 1}
          if(value.hh.bar) {result.hh += 1}

        });
        return result;
      }
    }

    self.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: true)
  end
end
0 голосов
/ 01 июня 2011

JavaScript выглядит нормально для меня, но, возможно, MongoDB добавляет дополнительные ограничения, которые приводят к странному сообщению об ошибке. Я могу подумать о двух вещах, которые вы можете попробовать: используйте hasOwnProperty, чтобы увидеть, есть ли foo и bar:

map = <<-MAP
 function() { 
    if (this.user_id == "#{user_id}") {   
        hsh = { };
        if (this.hasOwnProperty('foo')) {
            hsh["foo"] = this.foo;
        }
        if (this.hasOwnProperty('bar')) {
            hsh["bar"] = this.bar;
        }
        emit(this.user_id, hsh);  
    }
} 
MAP

или используйте скобку для доступа к свойствам this:

map = <<-MAP
 function() { 
    if (this.user_id == "#{user_id}") {   
        hsh = { };
        if (typeof this['foo'] != 'undefined') {
            hsh["foo"] = this.foo;
        }
        if (typeof this['bar'] != 'undefined') {
            hsh["bar"] = this.bar;
        }
        emit(this.user_id, hsh);  
    }
} 
MAP

Обратите внимание, что я ужесточил логику в этом, чтобы увидеть, существуют ли foo и bar, а не просто проверять их правдивость.

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