2012-08-28 1 views
4

J'ai le code suivant qui fonctionne comme prévu:Comment interroger un élément avec un tableau non vide avec mongoid?

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

Cependant, je voudrais effectuer la requête pour renvoyer des questions avec tableau related_questions supérieur à 0. Par exemple,

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

est-il un moyen de le faire avec mongoid ou mongodb?

Répondre

2

Vous pouvez utiliser le $size operator pour interroger les tailles de tableau. Prenons l'exemple suivant l'utilisation du shell 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 } 

Je ne suis pas familier avec MongoId, mais je trouve un exemple en utilisant $size dans this documentation. Deux avertissements avec $size sont qu'il ne peut pas utiliser un index (d'autres parties de la requête peuvent certainement) et il ne peut pas être utilisé dans les requêtes de plage. Si cela ne vous dérange pas la comptabilité supplémentaire, une option viable est de stocker la taille de la matrice dans un champ séparé (probablement indexé) et interroger sur ce comme vous le souhaitez.

+6

Cela fonctionne vraiment, et la bonne façon de MongoId serait: Question.where. (: Related_question_ids.not => { "$ size" => 0}) Taille – Kamilski81

1

Cette requête de recherche si existe un objet dans les related_question_ids [0] champ

utilisant shell js

db.questions.find("related_question_ids.0": {exists => true})

En utilisant MongoId

Mongoid::Criteria.new(Question).where(:"related_question_ids.0".exists => true)

Vous pouvez effectuer une recherche plus tout taille

Mongoid::Criteria.new(Question).where(:"related_question_ids.3".exists =>true)

Ce résoudre votre problème

Questions connexes