我有一个用户模型,其中有一个部门字段,它的默认值是"Engineering“。
这个领域是在我们的网站上线2个月后推出的,自从它的mongo之后,就没有迁移了。
当我尝试使用where获取对象时,将返回正确的值。
 User.find_by(:name => "John).department但是,如果我试图提取值,它将返回零,而不是默认值。
 User.limit(2).pluck(:department)返回
[nil,"Finance"]我研究了一下,发现了一篇博文http://ahmadsherif.com/blog/2013/01/29/mongoid-default-fields-can-give-you-hard-time/。
我想我也面临着同样的问题。有这方面的工作吗?我选择使用pluck,因为它不是内存密集型的,而且节省时间。
发布于 2016-04-01 11:00:57
基本上,这里的行为可以通过MongoDB处理默认值与传统关系数据库(如Postgres )的区别来解释。
在SQL世界中,您通过数据库模式设置默认值,每次插入一行时,DB都会填充一个空字段。
由于MongoDB是无模式的,文档字段的默认值为nil,因此不能更改*因为没有模式可以在数据库级别上定义默认值。相反,缺省值是在应用程序级别上实现的。对于Mongoid,这意味着当您初始化一个新的模型实例时,如果它们是零,它将填充默认值。
从ActiveRecord的角度来看,它应该是这样的:
class Thing < ActiveRecord::Base
  after_initialize :set_default_foo, if: -> { self.foo.nil? }
  private 
    def set_default_foo
      self.foo = "bar"
    end
end但是,如果您有现有文档并添加了一个新字段或默认为现有字段,Mongoid将不会为您更新现有文档!
这又如何解释这两个案子呢?
User.find_by(:name => "John").department
User.limit(2).pluck(:department)在第一种情况下,您需要从存储中提取一个文档,并使用它来将模型实例初始化。初始化模型实例时,将运行回调,该回调设置默认值。
当.pluck被调用时,Mongoid直接从存储中提取值,而不初始化任何模型实例。因此,对于任何“遗留”文档,它都将返回一个零值。
要解决这个问题,您需要为任何带有零的文档设置默认值。
User.where(department: nil).update_all(department: 'engineering')https://stackoverflow.com/questions/36353723
复制相似问题