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
Michel