在mongoose / mongodb中按日期分组?

时间:2018-11-17 17:29:43

标签: node.js mongodb mongoose mongodb-query

注意:Mongo 3.6.2版。

我有一个看起来像这样的文档:

<!DOCTYPE html>
<html>
    <head></head>
    <body>
        <ul id="ulid">
            <li>第一个</li>
            <li>第二个</li>
            <li>第三个</li>
        </ul>
        <br/>
        <input type="button" value="添加" onclick="add1();"/>
    </body>
    <script type="text/javascript">
       function add1(){
           var li1 = document.createElement("li").appendChild(document.createTextNode("下一个"))
           document.getElementById("ulid").appendChild(li1);
        }
    </script>
</html>

我想在[[Dep,POR],[14073,99.25],[14072,0.06]]Dep,POR,14073,99.25,14072,0.06 上做一个mongodb groupBy,其中event_id =X。所以输出应该像这样:

  function get_historical() {
    var well = document.getElementById('wellSelect'); 
    var selected_well = well.options[well.selectedIndex].value; 
    var hist_json_obj = JSON.parse(Get("/get_historical/" + selected_well));
    hist_por = ['Dep','POR'];
    for (var item in hist_json_obj) {
      if (hist_json_obj.hasOwnProperty(item)) {
         var dep = hist_json_obj[item].dep;
         var por = hist_json_obj[item].por;

         var arr_por = [dep, parseFloat(por)];
         hist_por.push(arr_por);

      }
    }
    document.write(hist_por);
  }

最困难的部分是const Ticket = new mongoose.Schema({ event_id: [ { required: false, type: mongoose.Schema.Types.ObjectId, ref: 'Event' } ], ticket_type: String, createdAt: String, }, { collection: 'tickets' }); 作为timemillis存储在字符串中,例如:

ticket_type

答案应如下所示:

createdAt

任何帮助将不胜感激。谢谢。

这是我想出的:

[{ ticket_type: 'VIP', date: 2011-11-11, count: 12}, {..}]

1 个答案:

答案 0 :(得分:1)

您可以使用$group聚合管道阶段。要将字符串转换为数字,您可以使用$toLong运算符,然后可以使用$add(也适用于ISODate)以零毫秒(new Date(0))将该值添加到日期中,以获取{{ 1}}。试试:

ISODate

编辑:假设您手动将字符串转换为数字,则可以运行以下查询以在ISODate的日期部分进行汇总:

Ticket.aggregate([
    {  $match: { event_id: req.params.event_id } },
    {
        $group: {
            _id: {
                ticket_type: "$ticket_type",
                createdAt: { $add: [ new Date(0), { $toLong: "$createdAt" } ] }
            }
        }
    } 
], function(err, tickCount) {
    if (err) {
        console.log(err);
    } else {
        res.json(tickCount);
    }
});