2016-04-01 11 views
0

Ich versuche, mit Pymongo mit mehreren Feldern zu aggregieren, aber ich habe keine Möglichkeit gefunden, den richtigen Wert zu erhalten.Pymongo Aggregation mit Multi-Felder

I Zählung der gesamten Dateien von 2 Felder erhalten müssen: time und state

time ein Objekt durch pymongo Datetime ist, und ich konnte nur yy/mm erhalten/dd mit

'$group': { "_id":{ 
      "date":{"$concat": [ 
        {"$substr": [{"$year": "$date"}, 0, 4 ]}, 
        "-", 
        {"$substr": [{"$month": "$date"}, 0, 2 ]}, 
        "-", 
        {"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]}, 
       ]}}, 
      "count":{"$sum": 1}} 

Dies kann das korrekte Datum für mich bekommen extrahieren und die Anzahl der Protokolle zählen, aber jetzt muss ich auch Gruppe von state so wird es GROUP BY date, state in mysql

ich versuchte es das Hinzufügen Innen _id

'$group': { "_id":{ 
      "date":{"$concat": [ 
        {"$substr": [{"$year": "$date"}, 0, 4 ]}, 
        "-", 
        {"$substr": [{"$month": "$date"}, 0, 2 ]}, 
        "-", 
        {"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]}, 
       ]}}, 
      "_id":{"state":"$timeline.state"}, 
      "count":{"$sum": 1}} 

und mehrere Ausgänge in dem Format, wie {u'count': 4111, u'_id': {u'state': [0, 1]}}, die 0 und 1 sind Codes für verschiedene Zustände schafft. Das Datum ist nirgendwo zu finden.

Ich habe dann versucht

'$group': { "_id":{ 
      "date":{"$concat": [ 
        {"$substr": [{"$year": "$date"}, 0, 4 ]}, 
        "-", 
        {"$substr": [{"$month": "$date"}, 0, 2 ]}, 
        "-", 
        {"$substr": [{"$dayOfMonth": "$date"}, 0, 2 ]}, 
       ]}}, 
      "state":"$timeline.state"}, 
      "count":{"$sum": 1}} 

und ich bekam failed: A pipeline stage specification object must contain exactly one field.

Das sieht aus wie ich nicht die Klammern an der richtigen Stelle bekommen hat, aber egal, wie ich das Format zu ändern, bleibt die gleiche Fehler . Jetzt frage ich mich, ob es wirklich das Problem der Klammer ist. Am wichtigsten, wie mache ich es richtig?

Antwort

1

Sie brauchen eine Verbindung _id Feld in Ihrem $group Punkt steht wie zu verwenden:

"$group": { 
    "_id":{ 
     "date":{ 
      "$concat": [ 
       { "$substr": [ { "$year": "$date" }, 0, 4 ] }, 
       "-", 
       { "$substr": [ { "$month": "$date" }, 0, 2 ] }, 
       "-", 
       { "$substr": [ { "$dayOfMonth": "$date" }, 0, 2 ] } 
      ] 
     }, 
     "state": "$timeline.state" 
    }, 
    "count": { "$sum": 1 } 
} 
+0

ich sehe. Also muss alles innerhalb '_id' Klammer sein. Ich denke, ich habe es jetzt zum Laufen gebracht. Nur einen "Count" zu haben, würde funktionieren, oder? Ich muss das "Datum" nicht zuerst zählen und dann noch einmal "Zustand" zählen? – JChao