gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 10:07:38 27 4
gpt4 key购买 nike

我有两个类(class)

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

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

我已经试过了

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 文档。

您正在做一个distinct,但是MongoDB 以不同的方式处理子对象和文档。因此,distinct 可能没有按照您的意愿执行。

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

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

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

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com