亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在mongodb中按日期分組

在mongodb中按日期分組

不負相思意 2019-10-28 10:28:20
我正在一個項目中,在其中跟蹤某個主題的點擊次數。我正在使用mongodb,我必須按日期對點擊次數進行分組(我希望對15天的數據進行分組)。我在mongodb中以以下格式存儲數據{    "_id" : ObjectId("4d663451d1e7242c4b68e000"),   "date" : "Mon Dec 27 2010 18:51:22 GMT+0000 (UTC)",   "topic" : "abc",   "time" : "18:51:22"}{     "_id" : ObjectId("4d6634514cb5cb2c4b69e000"),     "date" : "Mon Dec 27 2010 18:51:23 GMT+0000 (UTC)",     "topic" : "bce",     "time" : "18:51:23"}我想按天數(15天)對topic:abc的點擊次數進行分組。.我知道如何進行分組,但是如何按存儲在數據庫中的日期進行分組我正在尋找以下格式的結果[  {    "date" : "date in log",    "click" : 9   },    {    "date" : "date in log",    "click" : 19  },  ]我已經編寫了代碼,但是僅當日期在字符串中時才有效(代碼在這里http://pastebin.com/2wm1n1ix)...請指導我如何將其分組
查看完整描述

3 回答

?
米琪卡哇伊

TA貢獻1998條經驗 獲得超6個贊

使用Mongo聚合框架的新答案

在詢問并回答了這個問題之后,10gen發布了具有聚合框架的Mongodb 2.2版,這是現在進行此類查詢的更好方法。該查詢有些挑戰,因為您要按日期分組,并且存儲的值是時間戳,因此您必須執行一些操作以將時間戳轉換為匹配的日期。出于示例目的,我將只編寫一個獲得正確計數的查詢。


db.col.aggregate(

   { $group: { _id: { $dayOfYear: "$date"},

               click: { $sum: 1 } } }

   )

這將返回類似:


[

    {

        "_id" : 144,

        "click" : 165

    },

    {

        "_id" : 275,

        "click" : 12

    }

]

您需要使用$match來限制查詢到您感興趣的日期范圍,然后$project重命名_id為date。讀者如何練習如何將一年中的日期轉換回日期。:-)


10gen有一個方便的SQL到Mongo聚合轉換圖表,值得收藏。還有一篇有關日期聚合運算符的文章。


有點兒幻想,您可以使用:


db.col.aggregate([

  { $group: {

      _id: {

        $add: [

         { $dayOfYear: "$date"}, 

         { $multiply: 

           [400, {$year: "$date"}]

         }

      ]},   

      click: { $sum: 1 },

      first: {$min: "$date"}

    }

  },

  { $sort: {_id: -1} },

  { $limit: 15 },

  { $project: { date: "$first", click: 1, _id: 0} }

])

它將為您提供最近的15天,并在該date字段的每一天之內返回一些日期時間。例如:


[

    {

        "click" : 431,

        "date" : ISODate("2013-05-11T02:33:45.526Z")

    },

    {

        "click" : 702,

        "date" : ISODate("2013-05-08T02:11:00.503Z")

    },

            ...

    {

        "click" : 814,

        "date" : ISODate("2013-04-25T00:41:45.046Z")

    }

]


查看完整回答
反對 回復 2019-10-28
?
慕娘9325324

TA貢獻1783條經驗 獲得超4個贊

這可以幫助


return new Promise(function(resolve, reject) {

db.doc.aggregate(

            [

                { $match: {} },

                { $group: { _id: { $dateToString: { format: "%Y-%m-%d", date: "$date" } }, count: { $sum: 1 } } },

                { $sort: { _id: 1 } }

            ]

        ).then(doc => {

            /* if you need a date object */

            doc.forEach(function(value, index) {

                  doc[index]._id = new Date(value._id);

              }, this);

            resolve(doc);

        }).catch(reject);

}


查看完整回答
反對 回復 2019-10-28
  • 3 回答
  • 0 關注
  • 1793 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號