Si j'ai une base de données avec cette structure

{
_id: int
P1: string
P2: [{
    _id: int
    C1: [int]
    C2: int
    C3: string
    C4: string
    C5: [{
        D1: string
        D2: {E1: string}
    }]
    C6: string
    C7: false
}]
}

Pour tous les objets P2, nous vérifions les valeurs D1 en double dans C5 et n'obtenons que les objets P2 non en double.

{_id:1, P1: "A", P2[{_id: 1, C1:[1], C2:1, C3:"X", C4:"B", C5[{D1:"123", D2:{E1: "331"}}], C6:"Ex", C7:true}]}
{_id:1, P1: "A", P2[{_id: 2, C1:[1], C2:1, C3:"Y", C4:"U", C5[{D1:"456", D2:{E1: "332"}}], C6:"Ea", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 3, C1:[1], C2:2, C3:"I", C4:"O", C5[{D1:"789", D2:{E1: "333"}}], C6:"Eq", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 4, C1:[1], C2:2, C3:"P", C4:"L", C5[{D1:"123", D2:{E1: "334"}}], C6:"Ee", C7:true}]}

Par conséquent, lorsque la structure de base de données suivante est construite, je veux ce résultat.

{_id:1, P1: "A", P2[{_id: 1, C1:[1], C2:1, C3:"X", C4:"B", C5[{D1:"123", D2:{E1: "331"}}], C6:"Ex", C7:true}]}
{_id:1, P1: "A", P2[{_id: 2, C1:[1], C2:1, C3:"Y", C4:"U", C5[{D1:"456", D2:{E1: "332"}}], C6:"Ea", C7:false}]}
{_id:2, P1: "Z", P2[{_id: 3, C1:[1], C2:2, C3:"I", C4:"O", C5[{D1:"789", D2:{E1: "333"}}], C6:"Eq", C7:false}]}

J'ai recherché les fonctions distinct et aggregate, mais je n'ai pas obtenu les résultats souhaités.

0
SangGeol 4 févr. 2020 à 11:41

1 réponse

Meilleure réponse

Cela ressemble à un simple $unwind et $group devrait suffire :

db.collection.aggregate([
    {
        $unwind: "$P2"
    },
    {
        $group: {
            _id: "$P2"
        }
    },
    {
        $replaceRoot: {
            newRoot: "$_id"
        }
    }
])

Si vous avez une exigence plus spécifique, essayez de donner une explication plus détaillée ou ajoutez des cas uniques avec leur exemple de sortie.

0
Tom Slabbaert 4 févr. 2020 à 09:24