2016-04-12 8 views
0

Ich versuche, eine Abfrage abzuleiten, um eine Anzahl unterschiedlicher Werte zu erhalten und die relevanten Felder anzuzeigen. Die Gruppierung erfolgt über die und die date, wobei die one-to-many mal innerhalb eines einzigen Tages und innerhalb eines Zeitrahmens auftreten kann.Bestimmte Vorkommen gruppieren und zählen

folgende ist mein Ansatz,

db.getCollection('targetCollection').aggregate( 
{  
    $match:{  
     "user.vendor": 'vendor1',  
     tool: "tool1",  
     date: {  
      "$gte": ISODate("2016-04-01"),  
      "$lt": ISODate("2016-04-04")  
     }  
    }  
},  
{  
    $group:{  
     _id: {  
      tempId: '$tempId', 
      month: { $month: "$date" },  
      day: { $dayOfMonth: "$date" },  
      year: { $year: "$date" }  
     },  
     count: {$sum : 1}  
    }  
}, 
{  
    $group:{  
     _id: 1,  

     count: {$sum : 1}  
    }  
}) 

Diese Abfrage erzeugt die folgende Ausgabe,

{ 
    "_id" : 1, 
    "count" : 107 
} 

Was ist richtig aber ist, ich mag sie nach Datum und mit der jeweiligen Zählung getrennt zeigen, für dieses Datum. Zum Beispiel so etwas,

{ 
    "date" : 2016-04-01 
    "count" : 50 
}, 
    { 
    "date" : 2016-04-02 
    "count" : 30 
}, 
    { 
    "date" : 2016-04-03 
    "count" : 27 
} 

P.S. Ich bin nicht sicher, wie ich diese Frage zusammenstellen soll, da ich mit dieser Technologie ziemlich neu bin. Bitte lassen Sie mich wissen, wenn Verbesserungen in der Frage erforderlich sind.

Es folgt die Probendaten der mongodb Sammlung, die ich abfragen versuche,

{ 
    "_id" : 1, 
    "tempId" : "temp1", 
    "user" : { 
     "_id" : "user1", 
     "email" : "[email protected]", 
     "vendor" : "vendor1" 
    }, 
    "tool" : "tool1", 
    "date" : ISODate("2016-03-09T08:30:42.403Z") 
},... 

Antwort

0

Ich habe mit der Lösung selbst kommen. Was ich tat, war,

  • ich zum ersten Mal von der tempId und die ich durch die Dieses date

gruppiert date

  • Dann gruppiert die tägliche verschiedene Anzahl der tempId ausgedruckt, das Ergebnis I wollen. Die Abfrage lautet wie folgt:

    db.getCollection('targetCollection').aggregate( 
    {  
        $match:{  
         "user.vendor": 'vendor1',  
         tool: "tool1",  
         date: {  
          "$gte": ISODate("2016-04-01"),  
          "$lt": ISODate("2016-04-13")  
         }  
        }  
    },  
    {  
        $group:{  
         _id: {  
          tempId: "$tempId", 
          month: { $month: "$date" },  
          day: { $dayOfMonth: "$date" },  
          year: { $year: "$date" }  
         },  
         count: {$sum : 1}  
        }  
    }, 
    {  
        $group:{  
         _id: {  
          month:"$_id.month" ,  
          day: "$_id.day" ,  
          year: "$_id.year"  
         },  
         count: {$sum : 1}  
        }  
    }) 
    
  • 0

    Gruppe sie über Datum

    db.getCollection('targetCollection').aggregate([ 
        { 
         $match:{  
          "user.vendor": 'vendor1',  
          tool: "tool1",  
          date: {  
           "$gte": ISODate("2016-04-01"),  
           "$lt": ISODate("2016-04-04")  
          }  
         }  
        }, 
        { 
         $group: { 
          _id: { 
           date: "$date", 
           tempId: "$tempId" 
          }, 
          count: { $sum: 1 } 
         } 
        } 
    ]); 
    
    +0

    Danke für die Antwort, aber die 'tempId' muss berücksichtigt werden. Die Abfrage, die ich ableiten möchte, besteht darin, für jeden Tag innerhalb des angegebenen Datumsbereichs die "Anzahl" jeder ** distinct ** "tempId" zu ermitteln. Ich habe die Frage aktualisiert. :) –

    +0

    @HasithaShan siehe Update – kiro112

    +0

    Hey danke, aber ich denke, es ist näher, aber es ist das gleiche wie ich. Das Datum sollte so gemacht werden, wie ich es getan habe, weil der Zeitstempel Sekunden enthält, also Gruppierung, die sowieso eine Intention geben würde. Ich muss die ** Gesamtzählung ** der ** distinct ** 'tempId's für jeden Tag erhalten. –