2017-03-10 3 views
2

ich eine Produktsammlung wie diese haben, vereinfacht:Mongo DB Aggregat mit eingebetteten Dokumente

[ 
    { 
    "_id": 1, 
    "ref": "product 1", 
    "variants": [ 
     { 
     "ref": "variant 1.1", 
     "categories": ["category a"] 
     }, 
     { 
     "ref": "variant 1.1", 
     "categories": ["category a","category b"] 
     } 
    ] 
    }, 
    { 
    "_id": 2, 
    "ref": "product 2", 
    "variants": [ 
     { 
     "ref": "variant 2.1", 
     "categories": ["category c"] 
     }, 
     { 
     "ref": "variant 2.1", 
     "categories": ["category a","category c"] 
     } 
    ] 
    } 
] 

Ich möchte für die Kategorien (distinct), mit deren Anzahl haltigen Produkten (nicht Varianten) abzufragen.

Zum Beispiel einige Ergebnis wie folgt aus:

[ 
    "category a": 2, 
    "category b": 1, 
    "category c": 1 
] 

Ich habe versucht, einige Abfragen mit Aggregat und entspannen, aber ich kann es nicht herausgefunden. Alle Hilfe geschätzt! Diese

ist das, was ich bisher:

[ 
    {$match: ... }, // optional filtering 
    {$unwind: '$variants'}, 
    {$unwind: '$variants.categories'}, 
] 

Aber kann jetzt nicht herausfinden, Howto Gruppe nach Kategorie, mit einer Gesamtzahl aller Produkte (nicht Varianten) innerhalb dieser Kategorie.

Antwort

1
db.products.aggregate([ 
    {$unwind: "$variants"}, 
    {$unwind: "$variants.categories"}, 
    {$group: {_id:"$_id", categories: {$addToSet:"$variants.categories"}}}, 
    {$unwind: "$categories"}, 
    {$group: {_id: "$categories", count: {$sum:1}}} 
]) 

Ausgang:

{ "_id" : "category b", "count" : 1 } 
{ "_id" : "category c", "count" : 1 } 
{ "_id" : "category a", "count" : 2 } 

Erklärung. Die ersten zwei Abroll Betreiber Kategorien aus verschachtelten Arrays bringen und Sie werden Dokumente wie diese

{ 
    "_id" : 1, 
    "ref" : "product 1", 
    "variants" : { 
     "ref" : "variant 1.1", 
     "categories" : "category a" 
    } 
}, 
{ 
    "_id" : 1, 
    "ref" : "product 1", 
    "variants" : { 
     "ref" : "variant 1.1", 
     "categories" : "category a" 
    } 
}, 
{ 
    "_id" : 1, 
    "ref" : "product 1", 
    "variants" : { 
     "ref" : "variant 1.1", 
     "categories" : "category b" 
    } 
}, 
... 

Next I duplizierten Kategorien von jeder Produktvariante zu beseitigen Sie gruppieren. Ergebnis:

{ 
    "_id" : 1, 
    "categories" : [ 
     "category b", 
     "category a" 
    ] 
}, 
... 

Ein mehr entspannen, um Kategorien Array loszuwerden.

{ 
    "_id" : 1, 
    "categories" : "category b" 
}, 
{ 
    "_id" : 1, 
    "categories" : "category a" 
}, 
{ 
    "_id" : 2, 
    "categories" : "category a" 
}, 
{ 
    "_id" : 2, 
    "categories" : "category c" 
} 

Und dann gruppieren, um die Anzahl der verschiedenen Kategorien in jedem Produkt zu berechnen. Sie werden wie oben angegeben ausgeben.

+1

Danke! Ausgezeichnet :) Ich muss darauf studieren ... – peterkin