【问题标题】:Throw error in Mongoid在 Mongoid 中抛出错误
【发布时间】:2015-05-21 14:13:45
【问题描述】:

假设我有这个代码:

map = %Q{
  function() {
    emit(this.name, { likes: this.likes });
  }
}

reduce = %Q{
  function(key, values) {
    var result = { likes: 0 };
    values.forEach(function(value) {
      if(value.likes < 0){
          #{Rails.logger.error "likes are negativ" }
      }
      result.likes += value.likes;
    });
    return result;
  }
}

Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: true)

如您所见,如果value.likes 为负值,我想记录一个错误:

#{Rails.logger.error "likes are negativ" }

但是每次我运行聚合时都会执行此代码,而不是在 likes 为负数时执行。

如何在聚合语句中引发错误?

【问题讨论】:

  • 每次都会执行是什么意思? if 块内的代码?

标签: ruby-on-rails ruby ruby-on-rails-4 mongoid aggregate


【解决方案1】:

让我们分析一下代码。首先:

map = %Q{
  function() {
    emit(this.name, { likes: this.likes });
  }
}

这里将一个字符串分配给变量map。请不要%Q{} 只是"" 的另一种写法。前者是另一种轻松定义具有双引号的字符串的语法。例如

# pretty
%Q{He said "You are awesome"}

# not so pretty
"He said \"You are awesome\""

接下来是:

reduce = %Q{
  function(key, values) {
    var result = { likes: 0 };
    values.forEach(function(value) {
      if(value.likes < 0){
          #{Rails.logger.error "likes are negative" }
      }
      result.likes += value.likes;
    });
    return result;
  }
}

这里将另一个字符串分配给变量reduce#{Rails.logger.error "likes are negative" } 只是一个记录错误并返回 true 的常规字符串插值。所以上面的代码相当于:

Rails.logger.error "likes are negative"
reduce = %Q{
  function(key, values) {
    var result = { likes: 0 };
    values.forEach(function(value) {
      if(value.likes < 0){
          true
      }
      result.likes += value.likes;
    });
    return result;
  }
}

你明白为什么每次都执行记录语句。

接下来是:

Band.where(:likes.gt => 100).map_reduce(map, reduce).out(inline: true)

这只是一个简单的语句,使用 mongoid 在 mongo 服务器上执行 map-reduce 命令,传递之前构建的 map 和 reduce 函数。

请注意,在上面的代码中,目的是在 javascript reduce 函数中执行 ruby​​ 代码。但是这是不可能的,因为reduce函数正在mongodb服务器上执行,无法执行日志语句。

处理这种情况的一种方法是减少到像{likes: 0, negative_likes: 0} 这样的哈希,有条件地增加negative_likes 并在接收结果时记录错误。

PS:使用聚合框架而不是 map-reduce 可能是一个更好的主意。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-10-28
    • 2016-10-23
    • 2015-05-26
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多