6

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

Mongoid::Criteria.new(Question).where(:related_question_ids.size => 0)

但是,我想执行查询以返回相关问题数组大于 0 的问题。例如,

Mongoid::Criteria.new(Question).where(:related_question_ids.size.gte => 0)

有没有办法用 mongoid 或 mongodb 做到这一点?

4

3 回答 3

4

此查询搜索是否存在 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)

这解决了你的问题

于 2016-06-02T13:30:41.170 回答
2

您可以使用$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是它不能利用索引(查询的其他部分当然可以)并且不能在范围查询中使用。如果您不介意额外的簿记,一个可行的选择是将数组的大小存储在单独的字段中(可能已编入索引)并以您喜欢的任何方式查询。

于 2012-08-29T19:35:54.867 回答
2

另一种方法是使用.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 => [])

要么应该工作。

于 2019-02-06T16:55:35.740 回答