Bonjour,

J'ai une requête à réaliser avec une condition relativement simple mais avec plusieurs AND et OR à parenthèses, et je suis débutant sur MongoDB. Je suis entrain de faire fausse route.

Je cherche dans une collection de documents ceux ayant un code commune particulier et qui ont une période (D,F) incluse totalement ou partiellement dans une période (d, f).

C'est à dire, avec cette condition :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
CodeCommune = code AND (D <= d AND F >= f) OR (D > d AND (F >= d AND F >= f)) OR (D < d AND (F >= d AND F <= f))
qui concrètement avec ce dont je dispose devrait ressembler à :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
codeCommune.code =  &0 AND (periode.debut <= &1 AND periode.fin >= &2) OR (periode.debut > d AND (periode.fin >= &1 AND periode.fin >= &2)) OR (periode.debut < &1 AND (periode.fin >= &1 AND periode.fin <= &2))
J'ai commencé à écrire cette requête en mongoDB ainsi :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
{'codeCommune.code' : ?0, 
   $or : 
   [
      {'periode.debut' : {'$lte' : ?1}, 'periode.fin' : {'$gte' : ?2}},
      {'periode.debut' : {'$gt' : ?1}, 'periode.fin' : {'$gte' : ?1}, 'periode.fin' : {'$gte' : ?2}},
      {'periode.debut' : {'$lt' : ?1}, 'periode.fin' : {'$gte' : ?1}, 'periode.fin' : {'$lte' : ?2}}
   ]
}
Et Mongo a coincé sur une JSONParseException en désignant la partie en rouge (J'écris en Java).
J'utilise la version 3.2.2 qui n'est pas dotée d'un analyseur syntaxique, et donc il n'y a pas de message pour dire ce qui ne va pas.

J'ai pensé qu'il fallait peut-être que je mette des $and. mais je ne suis pas sûr que ce soit obligatoire.
Et du coup, je ne suis pas trop sûr de ce qu'il faudrait que je fasse : de cette manière en regroupant jusqu'à 3 conditions par $and ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
{'codeCommune.code' : ?0, 
   $or : 
   [
      $and : ['periode.debut' : {'$lte' : ?1}, 'periode.fin' : {'$gte' : ?2}],
      $and : ['periode.debut' : {'$gt' : ?1}, 'periode.fin' : {'$gte' : ?1}, 'periode.fin' : {'$gte' : ?2}],
      $and : ['periode.debut' : {'$lt' : ?1}, 'periode.fin' : {'$gte' : ?1}, 'periode.fin' : {'$lte' : ?2}]
   ]
}
Ou ainsi, en s'assurant qu'elles ne dépassent pas deux par évaluation ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
{'codeCommune.code' : ?0, 
   $or : 
   [
      $and : [{'periode.debut' : {'$lte' : ?1}, 'periode.fin' : {'$gte' : ?2}}],
      $and : [
           $and : [{'periode.debut' : {'$gt' : ?1}, 'periode.fin' : {'$gte' : ?1}}], 'periode.fin' : {'$gte' : ?2}
      ] 
      $and : [
           $and : [{'periode.debut' : {'$lt' : ?1}, 'periode.fin' : {'$gte' : ?1}}], 'periode.fin' : {'$lte' : ?2}
      ]
   ]
}
Dans les deux cas, je suis convaincu de faire fausse route car ce n'est pas possible de devoir convertir cette condition de 210 caractères
codeCommune.code = &0 AND (periode.debut <= &1 AND periode.fin >= &2) OR (periode.debut > d AND (periode.fin >= &1 AND periode.fin >= &2)) OR (periode.debut < &1 AND (periode.fin >= &1 AND periode.fin <= &2))
en une requête de 300 ou 350 caractères de long !

En réfléchissant, je me suis rendu compte que j'étais entrain d'écrire l'arbre de syntaxe abstraite que Mongo doit exécuter ! Et c'est la certitude que je n'y suis pas : je suis entrain de faire par quelque-part son boulot à sa place.

Il doit y avoir une manière que je retrouve mes conditions avec les parenthèses dedans comme elle sont d'office.
J'ai l'impression que j'ai utilisée une couche trop basse du driver MongoDB de Java. On doit utiliser quelque-chose d'autre, mais je ne sais pas quoi.
Si je le laisse mes requêtes ainsi, elles vont vite devenir inmaintenables : elles ne font quasiment rien et sont déjà lourdes syntaxiquement.