2016-11-28 4 views
1

Das Modell der docs ist wie folgt:mehrere subcounts in MongoDB Aggregat Pipeline

{ 
    _id: ObjectID, 
    name: String, 
    taxonomy: { 
     segment : Number, 
     class : Number, 
     subclass : Number, 
    } 
} 

Ich bin ein Aggregat Abfrage ausgeführt wird, der die Dokumentation von „taxonomy.segment“ Gruppen, in jedem einzelnen Dokument zählt, und gibt mir die eindeutigen Werte "Klasse" und "Unterklasse" für jede Gruppe, mit einem Blick auf die Segmentdetails für zusätzliche Informationen.

db.getCollection('global_products').aggregate([{ 
     $group :{ 
      _id : { 
       seg:'$taxonomy.segment' 
      }, 
      count : { 
       $sum : 1 
      }, 
      classes: { 
       $addToSet:{ 
        code:'$taxonomy.class' 
       }, 
      }, 
      subclasses: { 
       $addToSet:{ 
        code:'$taxonomy.subclass' 
       } 
      }, 
     } 
    },{ 
     $lookup: { 
      from:'global_taxonomy',localField:'_id.seg',foreignField:'code', as:'segment_details' 
     } 
    }, 
]) 

Ich mag die Zählungen für jede Art von Klassen und Unterklassen hinzufügen, aber kann nicht scheinen, einen Weg, um herauszufinden. Ist es möglich, die Gesamtpipeline zu verwenden?

Um zu klären, würde ich subcount Werte in der folgenden JSON hinzufügen:

{ 
    "_id" : { 
     "seg" : 64000000 
    }, 
    "count" : 1906, 
    "classes" : [ 
     {"code" : 64010200, subcount:x}, 
     {"code" : 64010300, subcount:y}, 
     {"code" : 64010100, subcount:z} 
    ], 
    "subclasses" : [ 
     {"code" : 64010200, subcount:s}, 
     {"code" : 64010300, subcount:t}, 
     {"code" : 64010100, subcount:u} 
    ], 
    "segment_details" : [ 
     { 
      "_id" : ObjectId("572c8eba2b311f69f9c1666a"), 
      "code" : 64000000, 
      "name" : "Main Stock", 
      "type" : "segment" 
     } 
    ] 
} 

Antwort

2

Sie können so etwas wie unten versuchen. Sie müssen eine Gruppierung gleichzeitig durchführen und dabei die Anzahl der Zeilen in dieser Gruppe zählen. Sie benötigen drei Gruppen, eine für jede Unterklasse, jede Klasse und jedes Segment. Ich werde sehen, ob Mongo 3.4 eine kürzere Möglichkeit hat, sich diesem zu nähern.

aggregate([{ 
    $group: { 
     _id: { 
      seg: '$taxonomy.segment', 
      classcode: '$taxonomy.class', 
      subclasscode: '$taxonomy.subclass' 
     }, 
     subclasscount: { 
      $sum: 1 
     } 
    } 
}, { 
    $group: { 
     _id: { 
      seg: '$_id.seg', 
      classcode: '$_id.classcode' 
     }, 
     subclasses: { 
      $addToSet: { 
       code: '$_id.subclasscode', 
       subcount: '$subclasscount' 
      } 
     }, 
     classcount: { 
      $sum: 1 
     } 
    } 
}, { 
    $group: { 
     _id: { 
      seg: '$_id.seg' 
     }, 
     classes: { 
      $addToSet: { 
       code: '$_id.classcode', 
       subcount: '$classcount' 
      } 
     }, 
     subclasses: { 
      $first: '$subclasses' 
     }, 
     count: { 
      $sum: 1 
     } 
    } 
}, { 
    $lookup: { 
     from: 'global_taxonomy', 
     localField: '_id.seg', 
     foreignField: 'code', 
     as: 'segment_details' 
    } 
}]) 
+0

scheint nicht alles zu tun, Ausgabe sagt: http://pastebin.com/1pe2kc3C – xShirase

+0

Können Sie Ihre Eingabe Sammlung für mich zu testen? – Veeram

+0

Vorbereitung der Daten zeigte mir meinen Tippfehler, es funktioniert in der Tat perfekt, danke! – xShirase