Mongo aggregate $cond et arrays
Bonjour, voici un exemple de la structure des documents que j'utilise (il y a plus de champs mais je n'ai indiqué que ceux utiles à mon problème) :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| {
"_id" : ObjectId("554a1f5fe36a768b362ea5c0"),
"store_state" : 1,
"services" : [
{
"id" : "XXX",
"state" : 1,
"active": true
},
{
"id" : "YYY",
"state" : 1,
"active": true
},
...
]
} |
Je voudrais sortir un nouveau champ (par exemple "XXX_active" avec "Y" si l'élément de services est "XXX" et actif et "N" dans tous les autres cas. Il faut prendre en compte le fait que l'élément de services "XXX" n'est pas obligatoirement présent dans le document (en revanche le tableau services est toujours présent) et dans ce cas il faut un "N".
Voici une requête avec aggregate pour le moment mais le problème c'est qu'elle me retourne "XXX_active" seulement si l'élément "XXX" est présent dans services, il me faudrait "XXX_active" pour tous mes documents, que l'élément soit là ou pas.
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| db.stores.aggregate([
{
"$match" : {"store_state": 1}
},
{
"$unwind": "$services"
},
{
"$project": {
"store_state" : 1,
"services": 1,
"XXX_active": {
"$cond": [
{
"$and": [
{"$eq":["$services.id", "XXX"]},
{"$eq":["$services.active",true]}
]
},"Y","N"
]
}
}
},
{
"$match": {
"services.id": "XXX"
}
},
{
"$group": {
"_id": {
"_id": "$_id",
"XXX_active": "$XXX_active"
},
"services": {
"$push": "$services"
}
}
},
{
"$project": {
"_id": "$_id._id",
"XXX_active": "$_id.XXX_active"
}
}
]) |
Le résultat doit ressembler à :
Code:
1 2 3 4 5 6 7 8 9 10 11 12
| {
"_id" : ObjectId("554a1f5de36a768b362e7e6f"),
"XXX_active" : "Y"
},
{
"_id" : ObjectId("554a1f5ee36a768b362e9d25"),
"XXX_active" : "N"
},
{
"_id" : ObjectId("554a1f5de36a768b362e73a5"),
"XXX_active" : "Y"
} |
Ou bien à ça si je souhaite ajouter un autre active pour d'autres services d'un document, par exemple :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| {
"_id" : ObjectId("554a1f5de36a768b362e7e6f"),
"XXX_active" : "Y",
"YYY_active" : "N"
},
{
"_id" : ObjectId("554a1f5ee36a768b362e9d25"),
"XXX_active" : "N",
"YYY_active" : "N"
},
{
"_id" : ObjectId("554a1f5de36a768b362e73a5"),
"XXX_active" : "Y",
"YYY_active" : "Y"
} |
Donc je résume, il faut que chaque document déterminé par le 1er match soient présents (ici store_state à 1), qu'ils aient un champ XXX_active et/ou YYY_active à "Y" si le service est présent et actif, "N" dans tous les autres cas (le champ XXX_active et/ou YYY_active devra donc être présent dans tous les cas).
Je suis dessus depuis un moment mais je débute sur mongo et je sèche un peu...
Si quelqu'un pourrait me donner un petit coup de main ce serait super!
Merci,