6

mongodb の私のコレクションは次のようになります。

{
    "AccountID" : "87f7fd60-d1ad-11e2-98bb-795730bce125",
    "userId" : ObjectId("51b59fbec46916e60d00000c"),
    "_id" : ObjectId("51b6e603e3efef161b000003"),
    "accessDate" : ISODate("2013-06-11T08:55:31.957Z"),
    "__v" : 0
}
{
        "AccountID" : "47f7fd60-d1ad-11e2-98bb-795730bce125",
        "userId" : ObjectId("51b59fbec46916e60d00000d"),
        "_id" : ObjectId("51b6e603e3efef161b000003"),
        "accessDate" : ISODate("2013-05-1T08:05:31.957Z"),
        "__v" : 0
}

以下の結果をもたらすクエリを作成するにはどうすればよいですか。これは、月と年でグループ化された結果と、1 日あたりのカウントです。

{
  "usage": [
    {
      "year": 2013,
      "monthlyusage": [
        {
          "month": 1,
          "dailyusage": [
            {
              "day": 1,
              "count": 205
            },
            {
              "day": 2,
              "count": 1109
            },
            {
              "day": 4,
              "count": 455
            }
          ]
        },
        {
          "month": 2,
          "dailyusage": [
            {
              "day": 11,
              "count": 256
            },
            {
              "day": 2,
              "count": 1001
            },
            {
              "day": 5,
              "count": 65
            }
          ]
        }
      ]
    },
    {
      "year": 2012,
      "monthlyusage": [
        {
          "month": 12,
          "dailyusage": [
            {
              "day": 1,
              "count": 78
            },
            {
              "day": 2,
              "count": 7009
            },
            {
              "day": 28,
              "count": 55
            }
          ]
        },
        {
          "month": 11,
          "dailyusage": [
            {
              "day": 11,
              "count": 800
            },
            {
              "day": 2,
              "count": 5094
            },
            {
              "day": 25,
              "count": 165
            }
          ]
        }
      ]
    }
  ]
}

mongoose.jsフレームワークを使用してこれを行うにはどうすればよいですか

4

1 に答える 1

20

Mongoose は、MongoDB 集約フレームワークの軽量ラッパーを提供します。集約が初めての場合は、MongoDB のドキュメント ( http://docs.mongodb.org/manual/aggregation/ ) で詳細を確認できます。

データを上で説明した形式に変換するには、一連の $group 操作で集計パイプラインを使用できます。ここでは、マングース フレームワークを使用しています。

var dateSchema = mongoose.Schema({…});
var DateItem = mongoose.model('DateItem', dateSchema);

DateItem.aggregate(
      { $group : { 
           _id : { year: { $year : "$accessDate" }, month: { $month : "$accessDate" },day: { $dayOfMonth : "$accessDate" }}, 
           count : { $sum : 1 }}
           }, 
      { $group : { 
           _id : { year: "$_id.year", month: "$_id.month" }, 
           dailyusage: { $push: { day: "$_id.day", count: "$count" }}}
           }, 
      { $group : { 
           _id : { year: "$_id.year" }, 
           monthlyusage: { $push: { month: "$_id.month", dailyusage: "$dailyusage" }}}
           }, 
      function (err, res)
           { if (err) ; // TODO handle error 
             console.log(res); 
           });
});

最初の $group は、毎日 1 つずつ、この形式のドキュメントになります。

{ 
  "_id" : { "year" : 2013, "month" : 8, "day" : 15 },
  "count" : 1
}

2 番目の $group は、月ごとにグループ化されたドキュメントになります。

{
  "_id" : { "year" : 2012, "month" : 11 },
 "dailyusage" : [
          { "day" : 6, "count" : 1 },
          { "day" : 9, "count" : 1 },
          ... ]
},

そして 3 番目の $group は、年ごとに 1 つずつ、さらに大きなドキュメントになります。

このクエリは、データを大規模な階層ドキュメントに集約します。ただし、集計後にこのデータに対してクエリを実行する予定がある場合、これはデータを格納する最も有用な形式ではない可能性があります。集計されたデータをどのように使用するかを検討してください。1 か月または 1 日に 1 つずつ、より小さなドキュメントを含むスキーマの方が便利な場合があります。

于 2013-09-17T14:24:11.190 に答える