2017-06-12 4 views
2

Ich habe Dokument, in dem ich Rechnungsnummern und eine Subdokument haben, in dem ich festgelegt, dass die Art der RechnungAggregate Count auf gruppierten Daten

{ 
    "inum" : "001", 
    "date" : "28-May-2017", 
    "value" : 10020, 
    "section" : { 
     "B2C" : false, 
     "B2B" : true 
    } 
}, 
{ 
    "inum" : "001", 
    "date" : "22-May-2017", 
    "value" : 3400, 
    "section" : { 
     "B2C" : false, 
     "B2B" : true 
    } 
}, 
{ 
    "inum" : "034", 
    "date" : "22-May-2017", 
    "value" : 80500, 
    "section" : { 
     "B2C" : true, 
     "B2B" : false 
    } 
} 

Jetzt habe ich und die Gruppierung von Dokumenten auf der Grundlage von Rechnungsnummern und ich bin Gruppierung mit Mungo-Abfrage und erhalten erwartetes Ergebnis. so wird es mir eine einzige Rechnung mit Summe von value wie unter

{ 
    "inum" : "001", 
    "value" : 13420, 
    "section" : { 
     "B2C" : false, 
     "B2B" : true 
    } 
}, 
{ 
    "inum" : "034", 
    "date" : "22-May-2017", 
    "value" : 80500, 
    "section" : { 
     "B2C" : true, 
     "B2B" : false 
    } 
} 

Jetzt gibt ich die gesamten Rechnungsnummern von differnet Abschnittstypen nach dem Gruppieren, wie oben Rechnung zählen will nicht. Abschnitt hat B2B & B2C so sollte es mir geben

{"b2b":1,"b2c":1} 

Above ich durch die Schaffung von Funktionen für alle Abschnitte tun können, aber ich nicht für Einzelpersonen Funktionen erstellen möchten Ich möchte mongodb Abfrage zählt erhalten für alle Abschnitte.

Ich habe, wie unten

{ 
       $group: { 
        _id : {inum:"$inum"}, 
        b2b: {$sum: {$cond: [{$eq:["$section.B2B", true]}, 1, 0]}}, 
     b2c: {$sum: {$cond: [{$eq:["$section.B2C", true]}, 1, 0]}}, 
       } 
      }, 
{$project: {_id:0}}, 

its me unmergered Rechnungsnummern { "b2b":2, "b2c":1 }

Aber ich möchte zählen nach dem Gruppieren Daten { "b2b":1, "b2c":1}

+0

Wenn ich Ihre Frage verstehe, möchten Sie die "fusioniert" zählt, richtig? Wenn dies der Fall ist, können die Abschnittsdaten für dieselbe Rechnung abweichen. Ich nehme an, das erste Dokument ist '{" B2B ": true," B2C ": false}' und das zweite Dokument ist "{" B2B ": false," B2C ": true}', was passiert dann? Sind beide wahr oder beide falsch? Oder geschieht dies nie und beide Dokumente zum "Zusammenführen" sollten die gleichen Werte haben? –

+0

Nein ... Es ist notwendig, dass Abschnitt Daten können nicht für die gleiche Rechnung abweichen .... Wenn eine Rechnung ist "B2B" wahr, dann wird es nur für "B2B" kein anderer Abschnitt wird wahr –

Antwort

1

Sie wollen "zwei" zählen zu geben $group Stadien hier. Ein $first für die „Kapitel“ zu verwenden, wenn auf „inum“ und eine andere Gruppierung auf null mit der tatsächlichen $sum Gruppierung:

[ 
{ "$group": { 
    "_id": "$inum", 
    "section": { "$first": "$section" } 
}}, 
{ "$group": { 
    "_id": null, 
    "b2b": { "$sum": { "$cond": [ "$section.B2B", 1, 0 ] } }, 
    "b2c": { "$sum": { "$cond": [ "$section.B2C", 1, 0 ] } } 
}} 
] 

Die erste ist gerade dabei zu „verschmelzen“, wie Sie Ihre Anfrage und nur halten die $first"section" Daten gefunden.

Letztere Bedingungen tun, um die Akkumulation über alle Dokumente, da das, was null als Gruppierungsschlüssel auswertet zu tun ist.

Die Syntax kann hier abgekürzt werden, die erste "If" Bedingung des ternären Ausdrucks zu prüfen ist eigentlich schon ein "boolean" true/false Wert. Also keine Notwendigkeit für den zusätzlichen Vergleich, um einen booleschen Wert zu erzwingen.

+0

Danke ... Es ist Aber manchmal gibt es mir ein unerwartetes Ergebnis. Lass mich das mal anschauen ... übrigens danke –

+0

@SaurabhSharma Du könntest "möglicherweise" ein Problem haben, bei dem nicht alle Schlüssel vorhanden sind. Sie könnten darüber nachdenken, eine erste '$ match'-Stufe mit [' $ exists'] (https://docs.mongodb.com/manual/reference/operator/query/exists/) für die verwendeten spezifischen Schlüssel einzubeziehen. Alternativ könnten Sie die Aggregationslogik mit [$ ifNull'] (https://docs.mongodb.com/manual/reference/operator/aggregation/ifNull/) erweitern, wenn dies der Fall ist.Wenn Sie immer noch ein bestimmtes Problem haben, das Sie nicht lösen können, dann stellen Sie eine neue Frage (https://stackoverflow.com/questions/ask) und jemand wird versuchen, das Problem anzugehen. –

Verwandte Themen