我正在尝试查询子集合中的文档数量。
这是我的背景:
class Pro
include Mongoid::Document
has_many :recommendations
scope :lost, -> { where(:recommendation_ids => []) }
scope :normal, -> { where(:recommendation_ids.ne => []) }
end
儿童收藏:
class Recommendation
include Mongoid::Document
belongs_to :pro
end
所以,现在我执行:
>> Pro.lost.count
0
>> Pro.all.select{|p| p.recommendations.count == 0}.count
1
我做错了什么?我也试过Pro.with_size(recommendation_ids: 0)
和其他一些变化,但没什么新的。
任何想法都会受到高度赞赏,提前谢谢。
Moped 2.0.1,Mongoid 4.0.0,Rails 4.0.6
答案 0 :(得分:0)
您已将范围编码为在空数组中搜索ID,因此它始终搜索0个数组的数组。
scope :lost, -> { where(:recommendation_ids => []) }
也许是这样的,如果你想传递一个参数。
scope :lost, ->(rec_ids) { where(:recommendation_ids => [rec_ids]) }
答案 1 :(得分:0)
我已经多次尝试找到这个问题的解决方案并且总是放弃。我只是想知道如何轻松模仿它。它可能不是一种可扩展的方式,但它适用于有限的对象计数。关键是这句documentation中的一句话:
返回条件对象的模型上的类方法也被视为范围,也可以链接。
因此,您可以定义类函数,而不是声明范围:
def self.lost
ids = Pro.all.select{|p| p.recommendations.count == 0}.map(&:id)
Pro.where(:id.in => ids)
end
优点是,您可以对关联的(推荐)模型执行各种查询,并返回那些满足这些查询的Pro实例(对我来说就是这种情况),最重要的是,您可以链接更多查询,如这样:
Pro.lost.where(:some_field => some_value)