【问题标题】:Field aliases with Mongoid and RailsMongoid 和 Rails 的字段别名
【发布时间】:2010-11-19 16:39:05
【问题描述】:

MongoDB 中的常见做法是使用短键名来节省空间。例如,有人可能想要使用“fn”而不是“first_name”

但是,在您的应用程序中,如果您到处使用“fn”,您就会被搞砸。太丑了特别是对于 Rails,在 Mongoid 中声明字段时是否有一种简单的方法来指定别名?

另外,有人知道任何使用 Mongoid 的开源示例项目吗?

谢谢!

【问题讨论】:

    标签: ruby-on-rails mongodb mongoid


    【解决方案1】:

    你应该考虑使用

     field :fn, :as => :firstname
    

    如此处所述: http://groups.google.com/group/mongoid/browse_thread/thread/ce3298d6a167bd70

    这是一个非常好的做法,mongoid 完全支持。

    【讨论】:

    • 这个想法是你的应用代码调用firstname而不是fn。 Mongoid 只是在 mongo 内部将字段存储为fn
    【解决方案2】:

    我从未在任何 MongoDB 项目中看到过短键名,所以我不会说这是常见的做法。我认为您不会看到明显的速度提高,并且会使您的代码不必要地复杂化。描述性名称是好的,只要它们不是描述性的,以至于您需要永远输入。

    有很多 MongoDB 开源项目。直接在github上搜索一下。

    -- 在下面编辑--

    这是一个相当自以为是的答案。覆盖其他答案中描述的处理方法(https://github.com/mongoid/mongoid/blob/master/lib/mongoid/attributes/processing.rb)在您必须具有小字段名称的情况下更合适。

    【讨论】:

    • 不是速度问题,是空间问题。存储“first_name”和“fn”十亿次(~10GB vs~2GB)之间存在很大差异。如果你在商用硬件上运行,空间很便宜,但如果你在服务器级硬件上运行,空间就很昂贵。见:blog.boxedice.com/2010/10/23/…
    • 我唯一看到需要缩短字段名称的情况是:1)小值,2)非常大的数据集,3)非常松散的模式(即席字段)。鉴于这 3 种情况,我同意覆盖处理方法是有意义的(如下所述)。即使这样,您在查询时也必须牢记这一点,因此您会产生相当复杂的代码。例如,如果我有一个非常大的数据集,小的值,但我的架构几乎永远不会改变(比如跟踪统计信息),那么我可能会选择 postgresql 而不是 mongodb。
    • 非常肯定 10Gen(MongoDB 背后的公司)的人们不同意 [1] Dave Rapin 的观点。正如@Intelekshual 提到的,您不仅可以节省大量磁盘空间,而且 Mongo 需要将您的工作集和索引存储在内存中。更小的文档意味着您可以在内存中存储更多,更不用说通过不必处理更多臃肿的 mongo 文档 [1] 来提高应用程序代码的性能:docs.mongodb.org/manual/faq/developers/…
    • 这是一个旧答案,但希望这能澄清理解——您想在 MongoDB 中使用短字段名称的主要原因是避免 16MB BSON 文档大小限制。但是在实践中,这可能对您没有用。它非常特定于用例。
    【解决方案3】:

    这样的东西应该可以在你的类文件中使用。 (它并没有在所有情况下都经过测试,只是将哈希传递给 create 或 update。)

      field :fn, :type => String
    
      alias :first_name :fn
      alias :filtered_process :process
    
      def process(attrs = nil)
        attrs[:fn] = attrs[:first_name] unless attrs.nil?
        filtered_process(attrs)
      end
    

    【讨论】:

    • Mongoid 3 内置了对字段别名的支持,因此您不必使用 ruby​​ 的 method-cache-destorying 别名方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多