如何使用mongoid查询非空数组的项?

时间:2012-08-28 20:56:37

标签: ruby mongodb mongoid

我有以下代码按预期工作:

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做到这一点?

3 个答案:

答案 0 :(得分:3)

此查询搜索是否存在related_question_ids [0]字段

中的任何对象

使用js shell

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)

这可以解决您的问题

答案 1 :(得分:2)

您可以使用$size operator按数组大小进行查询。请考虑使用JS shell的以下示例:

> 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,但我在this documentation中找到了使用$size的示例。

$size的两个警告是它不能使用索引(查询的其他部分当然可以)并且它不能用于范围查询。如果您不介意额外的簿记,一个可行的选择是将数组的大小存储在一个单独的字段中(可能已编入索引)并以您喜欢的方式查询。

答案 2 :(得分:1)

执行此操作的另一种方法是使用查询的.nin(非IN)形式:

Mongoid::Criteria.new(Question).where(:related_question_ids.nin => [nil,[]])

这只会返回一个related_question_ids不为nil且不为空数组的问题。

相反,您可以将:related_question_ids定义为默认值(:default => []),然后只需要查询.ne(不等于),就像这样:

Mongoid::Criteria.new(Question).where(:related_question_ids.ne => [])

应该都可以。