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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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,