【问题标题】:Mongoid on RoR3: 1) how to return specific field on query? 2) what inverse_of is needed for?RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要什么 inverse_of ?
【发布时间】:2011-10-04 23:22:51
【问题描述】:

嗯,标题是不言自明的。但是,让我详细说明一下。 首先,我正在使用 Mongoid,这是一个用于在 Rails 应用程序中使用 MongoDB 的 Gem。

#1) 我有一个大集合,其中包含有关地图的信息。一张地图嵌入了很多瓦片,每个瓦片都引用了一个地形集合、一个用户集合,还有一些其他的信息。因此,如果我从地图中获取所有图块,我将拥有一个非常大的结构。但是,我想缓存一个包含仅包含地形信息的矩阵的结构。为了做到这一点,我选择了所有瓦片(以及所有不需要的信息)并仅使用地形字段。如何仅选择 Mongoid 上的地形字段?我尝试在几种方式上使用 select 进行操作,但我没有设法做到这一点..(顺便说一下,只是为了举例说明,我使用 "Map.first.tiles" 行访问了 tiles 数组。

#2) 好吧..我已经在这里了,所以,为什么不问这个。我真的应该在我的模型上使用 inverse_of 字段吗?我没有在任何地方使用它,而且一切似乎都运行良好。我不明白为什么需要它,因为确定将它们放在哪里以及它们的反面是什么非常简单。

提前致谢。 费尔南多。

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

    一般来说,在一个 mongoid 查询中只选择 1 个或多个属性:

    Map.only(:name).all
    

    我不会打扰 inverse_only 除非 Mongoid 需要帮助找出类。一般不需要。

    如果您只需要返回嵌入文档的某些属性,则需要使用完整路径:

    Map.first.tiles
     => [#<Tile _id: 4e1e486042f5bc06e7000002, name: "Earth", distance: 34>]
    
    Map.only("tiles.name").first.tiles
     => [#<Tile _id: 4e1e488742f5bc06e7000003, name: "Earth", distance: nil>]
    

    【讨论】:

    • 感谢您的回答。关于#1,我使用了“Map.only(“tiles.row”).first.tiles,它返回了几个“#”像文件。当我只选择我需要的字段时,您认为性能有什么提升吗?或者,通过将所有其他字段返回为 nil,性能的提升就无关紧要了?再次感谢! :)
    • mongodb 在只返回你想要的字段(使用 .only() 范围)方面有相当大的性能提升。
    • 为什么我的 MongoId 中没有显示 only 方法?我正在使用 3.0 版
    • 我在这里是因为我记得前段时间使用only,当时 mogoid 不是 mongodb 项目的一部分,现在我正在浏览文档,但我找不到任何提及它。知道为什么吗?它被删除了吗?已弃用?还有什么(新的)可以作为only 标准执行的吗?谢谢
    【解决方案2】:

    你也可以使用pluck

    标准#pluck

    Band.all.pluck(:name)

    获取所提供字段的所有值。未设置返回 nil 字段和不存在的字段。

    来源:https://docs.mongodb.com/ecosystem/tutorial/mongoid-queries/

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-18
      • 2012-01-06
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多