6

期待どおりに動作する次のコードがあります。

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

ただし、クエリを実行して、0 より大きい related_questions 配列を持つ質問を返したいと考えています。たとえば、

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::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 シェルを使用した次の例を考えてみましょう。

> 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まし

2 つの注意点$sizeは、インデックスを利用できないこと (クエリの他の部分は確かに利用できます) と、範囲クエリでは使用できないことです。追加の簿記を気にしない場合、実行可能なオプションは、配列のサイズを別のフィールド (おそらくインデックス付き) に格納し、好きな方法でクエリを実行することです。

于 2012-08-29T19:35:54.867 に答える