我有以下代码按预期工作:
Mongoid::Criteria.new(Question).where(:related_question_ids.size => 0)
但是,我想执行查询以返回相关问题数组大于 0 的问题。例如,
Mongoid::Criteria.new(Question).where(:related_question_ids.size.gte => 0)
有没有办法用 mongoid 或 mongodb 做到这一点?
此查询搜索是否存在 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)
这解决了你的问题
您可以使用$size 运算符按数组大小进行查询。考虑以下使用 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,但我$size
在本文档中找到了一个使用示例。
需要注意的两个问题$size
是它不能利用索引(查询的其他部分当然可以)并且不能在范围查询中使用。如果您不介意额外的簿记,一个可行的选择是将数组的大小存储在单独的字段中(可能已编入索引)并以您喜欢的任何方式查询。
另一种方法是使用.nin
查询的 (Not IN) 形式:
Mongoid::Criteria.new(Question).where(:related_question_ids.nin => [nil,[]])
这只会返回一个问题,其中 related_question_ids 不是 nil 并且不是空数组。
相反,您可以定义:related_question_ids
一个默认值 ( :default => []
),然后只需要查询.ne
(Not Equal),如下所示:
Mongoid::Criteria.new(Question).where(:related_question_ids.ne => [])
要么应该工作。