RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要啥 inverse_of ?

Posted

技术标签:

【中文标题】RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要啥 inverse_of ?【英文标题】: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 字段吗?我没有在任何地方使用它,而且一切似乎都运行良好。我不明白为什么需要它,因为确定将它们放在哪里以及它们的反面是什么非常简单。

提前致谢。 费尔南多。

【问题讨论】:

【参考方案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/

【讨论】:

以上是关于RoR3 上的 Mongoid:1)如何在查询中返回特定字段? 2)需要啥 inverse_of ?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Mongoid / MongoDB 中为 $within 查询选择单位

如何查询 mongoid 中的所有哈希值?

如何使用 Mongoid 查看原始 mongoDB 查询

如何在 mongoid dsl 中编写 mongodb $near 查询?

查询 Mongoid 哈希字段

如何使用 Ruby Geocoder/Mongoid 查询某个点附近的对象?