Mongodb, requête sur la présence d'un index géo

17 views
Skip to first unread message

Michel Pigassou

unread,
Mar 8, 2014, 4:20:14 PM3/8/14
to rubyfr...@googlegroups.com
Je suis en train de tester Mongodb via Mongoid et j'ai un petit soucis.

J'ai un index de type 2d (exemple avec Mongoid) :

index({ position: '2d' }

Et un autre champ, admettons un booléen.

Je veux créer un scope pour me sortir les documents qui ont bien une position (peut importe laquelle).

Si je créé un scope uniquement sur la position je n'ai pas de soucis :
scope :with_position, lambda { where(:position => {'$nin' => [nil, []]}) }

(je sais qu'il y a d'autres choses qui fonctionnent mais je copie-colle mon dernier essai en date)

Par contre dès que je veux combiner le scope sur la position et celui sur le booléen :
scope booléen : scope :is_hungry, where(hungry: true)

Par exemple MyModel.is_hungry.with_position j'obtiens :

failed with error 13068: "exception: geo field only has 1 element :: caused by :: $nin: [ null, {} ]"
(la dernière partie du message d'erreur dépend bien sûr de ce que j'ai essayé)

et du coup j'ai testé, un troisième scope qui combine les deux, sauf que la syntaxe pour la position est différente :

scope :hungry_with_position, lambda {
    is_hungry.where(
    'position.0' => {'$exists' => true},
    'position.1' => {'$exists' => true}
    )
  }

Et là je ne comprends pas pourquoi. Si quelqu'un peut m'expliquer la subtilité je suis preneur :
- pourquoi est-on obligé de distinguer les différentes parties du Array
- pourquoi le scope with_position seul fonctionne très bien

C'est peut être lié au bug suivant (https://jira.mongodb.org/browse/SERVER-10917) mais je suis en 2.4.8...

Michel
Reply all
Reply to author
Forward
0 new messages