蒙古式采摘-在模型中不返回具有默认值的正确值

马诺吉(Manoj MJ)

我有一个用户模型,其中有一个部门字段,其默认值为“工程”。

该字段是在我们的网站上线两个月后才引入的,并且自mongo以来没有任何迁移。

当我尝试使用where获取对象时,返回正确的值

 User.find_by(:name => "John).department

但是,如果我尝试使用值,它将返回nil而不是默认值。

 User.limit(2).pluck(:department)

退货

[nil,"Finance"]

我进行了一些研究,发现此博客文章http://ahmadsherif.com/blog/2013/01/29/mongoid-default-fields-can-give-you-hard-time/

我认为我也面临着同样的问题。有什么解决办法吗?我选择顺其自然,因为它不占用大量内存,而且可以节省时间。

最大限度

基本上,这里的行为可以通过MongoDB处理默认值与传统关系数据库(如Postgres)之间的差异来解释。

在SQL世界中,您通过数据库模式设置默认值,并且每次插入一行时,DB都会填充NULL字段。

由于MongoDB是无模式的,因此文档字段的默认值为nil,无法更改*,因为没有可在数据库级别定义默认值的模式。而是在应用程序级别上实现默认值。对于Mongoid,这意味着在初始化新的模型实例时,它将填充默认值为nil的默认值。

用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直接从存储中提取值,而无需初始化任何模型实例。因此,对于任何“旧版”文档,它将返回nil值。

要解决此问题,您需要为任何带nil的文档设置默认值。

User.where(department: nil).update_all(department: 'engineering')

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

多个蒙古式哈希值的Atomic Inc

来自分类Dev

无法保存蒙古式哈希值

来自分类Dev

在蒙古语数据库中采摘vs截然不同。哪个更快?

来自分类Dev

蒙古式标准结果未填充所有字段

来自分类Dev

Mongo :: Error :: OperationFailure未知修改器:$ pushAll在更新模型时(蒙古式,角度式,轨道式)

来自分类Dev

Scala:重载方法之间的首选项具有隐式,currying和默认值

来自分类Dev

C ++中隐式Default构造函数的默认值

来自分类Dev

查询具有多次采摘的嵌套模型

来自分类Dev

具有默认值的Laravel模型方法

来自分类Dev

在Kotlin中为具有函数链的可为空值返回默认值

来自分类Dev

毫无结果的蒙古式标准

来自分类Dev

使用默认值时,没有隐式视图可从A => Ordered [A]获得

来自分类Dev

SharedPreferences 不返回默认值

来自分类Dev

救援具有默认值的DivisionByZero返回红宝石中的NaN吗?

来自分类Dev

仅返回具有在Algolia中设置了显式值的属性的查询

来自分类Dev

在未指定捕获默认值的模板lambda中隐式捕获const变量

来自分类Dev

如何确定函数参数是自动设置为默认值还是在C ++中显式设置?

来自分类Dev

在C#中未调用隐式运算符作为struct的默认值

来自分类Dev

在未指定捕获默认值的模板lambda中隐式捕获const变量

来自分类Dev

类方法隐式参数的默认值

来自分类Dev

groovy中具有默认值的命名参数

来自分类Dev

在Rapidminer中添加具有默认值的新属性

来自分类Dev

具有类继承的kwargs中的默认值

来自分类Dev

在React.FC中具有默认值的表单

来自分类Dev

Phoenix模板中的变量或具有默认值

来自分类Dev

附加属性在样式中始终具有默认值

来自分类Dev

Rails中模型的默认值

来自分类Dev

具有默认值的Javascript对象

来自分类Dev

Protobuf:具有默认值的枚举

Related 相关文章

  1. 1

    多个蒙古式哈希值的Atomic Inc

  2. 2

    无法保存蒙古式哈希值

  3. 3

    在蒙古语数据库中采摘vs截然不同。哪个更快?

  4. 4

    蒙古式标准结果未填充所有字段

  5. 5

    Mongo :: Error :: OperationFailure未知修改器:$ pushAll在更新模型时(蒙古式,角度式,轨道式)

  6. 6

    Scala:重载方法之间的首选项具有隐式,currying和默认值

  7. 7

    C ++中隐式Default构造函数的默认值

  8. 8

    查询具有多次采摘的嵌套模型

  9. 9

    具有默认值的Laravel模型方法

  10. 10

    在Kotlin中为具有函数链的可为空值返回默认值

  11. 11

    毫无结果的蒙古式标准

  12. 12

    使用默认值时,没有隐式视图可从A => Ordered [A]获得

  13. 13

    SharedPreferences 不返回默认值

  14. 14

    救援具有默认值的DivisionByZero返回红宝石中的NaN吗?

  15. 15

    仅返回具有在Algolia中设置了显式值的属性的查询

  16. 16

    在未指定捕获默认值的模板lambda中隐式捕获const变量

  17. 17

    如何确定函数参数是自动设置为默认值还是在C ++中显式设置?

  18. 18

    在C#中未调用隐式运算符作为struct的默认值

  19. 19

    在未指定捕获默认值的模板lambda中隐式捕获const变量

  20. 20

    类方法隐式参数的默认值

  21. 21

    groovy中具有默认值的命名参数

  22. 22

    在Rapidminer中添加具有默认值的新属性

  23. 23

    具有类继承的kwargs中的默认值

  24. 24

    在React.FC中具有默认值的表单

  25. 25

    Phoenix模板中的变量或具有默认值

  26. 26

    附加属性在样式中始终具有默认值

  27. 27

    Rails中模型的默认值

  28. 28

    具有默认值的Javascript对象

  29. 29

    Protobuf:具有默认值的枚举

热门标签

归档