web-dev-qa-db-fra.com

MongoDB: Comment obtenir une liste distincte de valeurs de champ de sous-document?

Disons que j'ai les documents suivants en collection:

{
   "family": "Smith",
   "children": [
        {
            "child_name": "John"
        },
        {
            "child_name": "Anna"
        },
    ]
}

{
   "family": "Williams",
   "children": [
        {
            "child_name": "Anna"
        },
        {
            "child_name": "Kevin"
        },
    ]
}

Maintenant, je veux obtenir en quelque sorte la liste suivante de noms d'enfants uniques traversant toutes les familles:

[ "John", "Anna", "Kevin" ]

La structure du résultat peut être différente. Comment y parvenir dans MongoDB? Cela devrait être quelque chose de simple mais je ne peux pas comprendre. J'ai essayé la fonction d'agrégat () sur la collection mais je ne sais pas comment appliquer la fonction distinct ().

29
vladimir

Vous pouvez simplement faire:

db.collection.distinct("children.child_name");

Dans votre cas, il renvoie:

[ "John", "Anna", "Kevin" ]
51
Asya Kamsky

avec le cadre d'agrégation d'aide:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name'}}])

ou plus d'intérêt;) avec la fréquence du nom:

db.collection.aggregate([{$unwind:'$children'}, {$group:{_id:'$children.child_name', freq:{$sum:1}}}])
6
Vladimir Muzhilov