我有以下的代码,按预期工作:
Mongoid::Criteria.new(Question).where(:related_question_ids.size => 0)
不过,我想执行的查询与related_questions阵列大于0例如更大的回报问题,
Mongoid::Criteria.new(Question).where(:related_question_ids.size.gte => 0)
有没有办法用mongoid或MongoDB中做到这一点?
您可以使用$size operator通过数组的大小来查询。考虑使用JS壳下面的例子:
> db.foo.drop()
> db.foo.insert({_id: 1, x:[1,2]});
> db.foo.insert({_id: 2, x:[]});
> db.foo.insert({_id: 3, x:3});
> db.foo.find({x: {$size: 0}})
{ "_id" : 2, "x" : [ ] }
> db.foo.find({x: {$size: 1}})
> db.foo.find({x: {$size: 2}})
{ "_id" : 1, "x" : [ 1, 2 ] }
> db.foo.find({x: {$not: {$size: 2}}})
{ "_id" : 2, "x" : [ ] }
{ "_id" : 3, "x" : 3 }
> db.foo.find({x: {$not: {$size: 0}}})
{ "_id" : 1, "x" : [ 1, 2 ] }
{ "_id" : 3, "x" : 3 }
我不熟悉Mongoid,但是我发现在$size
使用this documentation一个例子。
两个警告与$size
是,它不能利用索引(当然可以查询的其他部分),并且它不能在范围查询中使用。如果你不介意额外的簿记,一个可行的办法是你喜欢的任何方式存储数组的大小在一个单独的领域(可能索引)和查询上。
此查询搜索如果在related_question_ids存在任何物体[0]字段
使用JS壳
db.questions.find("related_question_ids.0": {exists => true} )
使用mongoid
Mongoid::Criteria.new(Question).where(:"related_question_ids.0".exists => true)
您可以搜索更大任何规模大小
Mongoid::Criteria.new(Question).where(:"related_question_ids.3".exists =>true)
该解决你的问题
另一种方式做,这是使用查询.nin
(不)形式:
Mongoid::Criteria.new(Question).where(:related_question_ids.nin => [nil,[]])
这只会返回一个问题,其中related_question_ids不为零,而不是一个空数组。
相反,你可以定义:related_question_ids
有一个默认值(:default => []
),然后你只需要查询.ne
(不等于),就像这样:
Mongoid::Criteria.new(Question).where(:related_question_ids.ne => [])
要么应该工作。