2016-08-22 4 views
1

Meine Sammlung:Wie basierend auf einzigartige Embedded Array Zählwerte

{ "_id" : 1, "type" : "A", "types" : [ "type1://asfasd", "type2://xcvxcv" ] } 
{ "_id" : 2, "type" : "B", "types" : [ "type1://xcv" ] } 
{ "_id" : 3, "type" : "C", "types" : [ "type2://aewqqwe" ] } 
{ "_id" : 4, "type" : "D", "types" : [ "type2://xcxc" ] } 

ich das Endergebnis will und mir sagen, zählen: Sie einen regulären Ausdruck

type1 -> 2 (because there are total of 2 documents that has type1) 
type2 -> 3 (because there are total of 3 documents that has type2) 
+0

ist alle Ihre Dokumente 'types' Präfixe Werte ('type1',' type2') haben eine konstante Länge (hier 5)? Oder gibt es Präfixe unterschiedlicher Länge (wie 'http' und' https')? – tarashypka

+0

Nein gibt es nicht in einer festen Größe (kann type1: //, othertype3: // sein). Ich nehme mindestens 3 Buchstaben vor dem: // ist OK (wenn Teilstr. Hier geplant ist?) – shayy

Antwort

0

Mit Karten reduzieren zu können Extrakt und Gruppe die Dokumente auf der Grundlage der Zeichenfolge, die Sie also Typ1 wollen, Typ2, type69 usw.

Soweit ich k Jetzt können Sie keine Regex mit Aggregationspipeline und Gruppenphase verwenden.

daher in der Karte Phase durchlaufen die Typen Array über, verwenden Sie einen regulären Ausdruck Saiten dh Typ1 zu extrahieren, Typ2, als diese Zeichenfolge als Schlüssel emittieren mit einem Wert von 1
In der Phase reduzieren, werden alle Werte mit dem gleichen Schlüssel werden in einer Liste sein, als Sie nur die Länge der Liste zählen:

var map = function map(){ 
    for (type in this.types){ 
     var str = this.types[type]; 
     var rx = /type\d+/; 
     var match = str.match(rx); 
     emit (match[0], 1); 
    } 
}; 

var reduce = function(key, values){ 
    return values.length 
}; 


db.runCommand({"mapReduce":"collection", map:map, reduce:reduce, out:{replace:"collection2"}}) 

Ex Ausgabe auf Ihre Daten:

{ "_id" : "type1", "value" : 2 } 
{ "_id" : "type2", "value" : 3 } 
Verwandte Themen