2016-10-19 3 views
0
メッセージ収集構造Iは、日付や送信者によってグループ化された応答を返しますクエリを使用して助けを必要と
Message = new Schema 
    type:   String 
    body:   Schema.Types.Mixed 
    sender:   { type: String, enum: ['machine', 'profile'], default: 'machine' } 
    created_at:  { type: Date, default: Date.now } 
    updated_at:  { type: Date, default: Date.now } 

クエリのMongoDB:created_atとし、送信者グループ

> db.messages.find({},{created_at: 1, sender: 1, _id: 0}) 

戻り

{ "created_at" : ISODate("2016-08-20T08:31:59.890Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-20T08:32:00.256Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-20T08:32:24.908Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-19T08:32:24.960Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-19T08:33:36.456Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-19T08:33:36.551Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-19T08:50:19.331Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-19T08:50:19.643Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-19T08:50:29.638Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-18T08:50:30.326Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-18T08:50:40.996Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-17T08:50:42.431Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-17T08:50:48.606Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-17T08:50:49.709Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-17T08:50:51.163Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-16T08:51:26.154Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-16T08:51:26.186Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-16T08:51:26.714Z"), "sender" : "machine" } 
{ "created_at" : ISODate("2016-08-15T08:53:36.383Z"), "sender" : "profile" } 
{ "created_at" : ISODate("2016-08-15T08:53:37.798Z"), "sender" : "machine" } 

例えば:日付= 2016年8月15日と送信者=プロファイルでは、カウント= 2

配列:

profile: [{ 2016-08-12: 10}, { 2016-08-13: 10} , { 2016-08-14: 5}] 

machine: [{ 2016-08-12: 10}, { 2016-08-13: 10} , { 2016-08-14: 5}] 

はモンゴフレンドリーなフォーマットでそれを起草とが必要です

答えて

1

私はプロジェクトでしょうISODatesender

クエリは次のようになります。

db.collection.aggregate([ 
    // Normalize ISODate and remove time part. 
    {$project: 
    {created_at: 
     { 
     $dateToString: 
     {format:"%Y-%m-%d", date:"$created_at"} 
     }, 
     sender:1 
    } 
    }, 
    // Group documents by created_at, sender and calculate number of documents. 
    {$group: 
    {_id: 
     {created_at:"$created_at", sender:"$sender"}, 
     count:{$sum: 1} 
    } 
    }, 
    // Sort result by created_at desc 
    {$sort: 
    {"_id.created_at":-1} 
    }, 
    // Optional: $project to make result look pretty. 
    {$project: 
    {_id:0, created_at:"$_id.created_at", sender:"$_id.sender", count:1} 
    } 
]) 

注:最終$projectステージはオプションです。

アウトのようなものになります。(私は簡潔にするために完全な結果をスキップしてい

{ 
    "count" : NumberInt(1), 
    "created_at" : "2016-08-20", 
    "sender" : "machine" 
} 
{ 
    "count" : NumberInt(2), 
    "created_at" : "2016-08-20", 
    "sender" : "profile" 
} 
{ 
    "count" : NumberInt(3), 
    "created_at" : "2016-08-19", 
    "sender" : "profile" 
} 
{ 
    "count" : NumberInt(3), 
    "created_at" : "2016-08-19", 
    "sender" : "machine" 
} 
. 
. 
. 
2

まず、各バケットの数をとって、をcreated_atsenderとする必要があります。次に、sender、および$pushにグループ化し、カウントを含む日付を配列にします。

[ 
    {$group: { 
     _id: { 
      date: { $dateToString: { format: "%Y-%m-%d", date: "$created_at" } }, 
      sender: '$sender' 
     }, 
     count: {$sum: 1} 
    }}, 
    {$group: { 
     _id: '$_id.sender', 
     arr: {$push: {date: '$_id.date', count: '$count'}} 
    }} 
] 
date上の通常の日付文字列とそのグループに
関連する問題