2016-06-29 12 views
1

Das ist mein SchemaWie bekomme ich Tagesberichte eines bestimmten Monats in Mongodb?

empname: {type: String}, 
soldby: {type: String}, 
expenseprice:{type:Number}, 
expensedesc:{type:String}, 
expensetype:{type:String}, 
createdat: {type: Date, default: Date.now} 

ich diese Abfrage

db.expenses.aggregate([ 
    { 
     $project: { 
      _id: 1, 
      year: { $year: "$createdat" }, 
      month: { $month: "$createdat" }, 
      day: { $dayOfMonth: "$createdat" }, 
      expenseprice: 1 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       year: "$year", 
       month: "$month", 
       day: "$day" 
      }, 
      sum: { $sum: "$expenseprice" } 
     } 
    } 
]) 

versucht, ich bin immer Ausgang als

{ "_id" : { "year" : 2015, "month" : 8, "day" : 15 }, "sum" : 200 } 
{ "_id" : { "year" : 2016, "month" : 5, "day" : 20 }, "sum" : 150 } 
{ "_id" : { "year" : 2016, "month" : 6, "day" : 29 }, "sum" : 250 } 

Ich möchte nur die Datensätze von bestimmten Jahr und bestimmten Monat und in in diesem Monat, so wie dieser Tag

{ "_id" : { "year" : 2016, "month" : 6, "day" : 28 }, "sum" : 150 } 
{ "_id" : { "year" : 2016, "month" : 6, "day" : 29 }, "sum" : 200 } 

versuchte ich $match zu

db.expenses.aggregate([ 
    { 
     $project: { 
      _id: 1, 
      year: { $year: "$createdat" }, 
      month: { $month: "$createdat" }, 
      day: { $dayOfMonth: "$createdat" }, 
      expenseprice: 1 
     } 
    }, 
    { 
     $match: { 
      $eq: ["$month", 06] 
     } 
    }, 
    { 
     $group: { 
      _id: { 
       year: "$year", 
       month: "$month", 
       day: "$day" 
      }, 
      sum: { $sum: "$expenseprice" } 
     } 
    } 
]) 

Aber ich bin immer Fehler wie diese

assert: command failed: { 
    "ok" : 0, 
    "errmsg" : "bad query: BadValue unknown top level operator: $eq", 
    "code" : 16810 
} : aggregate failed 
[email protected]/mongo/shell/utils.js:23:13 
[email protected]/mongo/shell/assert.js:13:14 
[email protected]/mongo/shell/assert.js:266:5 
[email protected]/mongo/shell/collection.js:1215:5 
@(shell):1:1 

2016-06-29T16:20:47.754+0530 E QUERY [thread1] Error: command failed: { 
    "ok" : 0, 
    "errmsg" : "bad query: BadValue unknown top level operator: $eq", 
    "code" : 16810 
} : aggregate failed : 
[email protected]/mongo/shell/utils.js:23:13 
[email protected]/mongo/shell/assert.js:13:14 
[email protected]/mongo/shell/assert.js:266:5 
[email protected]/mongo/shell/collection.js:1215:5 
@(shell):1:1 

Antwort

1

entnehmen Sie bitte das unten stehende Beispiel dafür, wie das Jahr und Monat in $ Gruppe bezeichnet werden kann. Nach meinem Verständnis ist das das letzte Bit, das Sie für Ihre Anforderung brauchen.

db.expenses.aggregate([ 
    {$project: {_id:1,year:{$year:"$createdat"},month:{$month:"$createdat"}, day:{$dayOfMonth:"$createdat"},expenseprice:1}}, 
    {$group: {_id:{year:"$year",month:"$month",day:"$day"}, sum:{$sum:"$expenseprice"}}}, 
    {$match : {"_id.year" : 2016, "_id.month" : 6}}]) 

Ich bin mir nicht sicher, warum Sie nach dem Spiel eine andere Gruppe hinzugefügt haben. Nach meinem ersten Verständnis ist es möglicherweise nicht erforderlich. Wenn die oben genannte Lösung nicht wie erwartet ist, aktualisieren Sie den Kommentar oder die Anforderung. Ich werde die Antwort entsprechend anpassen.

Ich habe meine Abfrage mit einigen Beispieldaten getestet. Die Daten werden für einen Monat gefiltert und ich erhalte die tagesgenaue Aufschlüsselung.

Verwandte Themen