ruby-on-rails - Mongoid:为适合选项的embedded_in对象返回不同的值

标签 ruby-on-rails ruby mongodb mongoid

我有两个类

class Claim
  include Mongoid::Document
  embeds_many :claim_fields
  belongs_to :user
  ...
end

class ClaimField
  include Mongoid::Document
  embedded_in :claim
  field :title
  field :value
  ...
end

我需要通过数据库获取具有当前标题的claim_fields的所有唯一值(不是通过Ruby - 对于数千条记录来说太慢了)

我已经尝试过了

user = User.find(...)
Claim.collection.distinct("claim_fields.value", {:user_id => user.id, "claim_fields.title" => some_title})
# that is the same as user.claims.find(...).distinct("claim_fields.value")

但它返回所有claim_fields值,并且我需要它仅返回具有我需要的标题的claim_fields的值。

PS 看起来我需要一些 MapReduce

最佳答案

这里的根本问题是 MongoDB 查询仅返回整个文档。您正在过滤 claim_fields.title,但系统会返回所有匹配的 Claim 文档。

您正在执行不同,但 MongoDB 对待子对象和文档的方式不同。因此,distinct 可能没有执行您想要的操作。

这里有两种可能的解决方案:

  1. 通过 M/R 预先计算。 (按照您的建议)
  2. 将它们分成两个集合。

关于#2,不需要像您那样嵌入对象。嵌入式应该根据您计划执行最多的查询来完成。因此,如果这是一个常见的查询,那么制作这些单独的文档是公平的。

关于ruby-on-rails - Mongoid:为适合选项的embedded_in对象返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7374686/

相关文章:

ruby-on-rails - 是否仍然推荐使用更多(Rails 的更少 CSS 插件)?

ruby-on-rails - 更新时 Rails 4 嵌套属性多条记录

Ruby,从路径+文件名获取路径

ruby-on-rails - ruby "each do"和 scriptaculous Effect.BlindDown/Up

javascript - 如何删除Mongoose中所有集合的所有文档

mysql - Rails 2.3 - 将大量搜索数据保存到 MySQL 的最有效方法是什么?

javascript - Ruby on Rails : How to TDD with javascript:void(0) route

ruby-on-rails - 为什么我无法安装 JSON gem?

MongoDB 并发

mongodb - 为 Elasticsearch 设置 MongoDB River