【问题标题】:Mongodb group and sort by date from subdocumentMongodb分组并按子文档中的日期排序
【发布时间】:2016-04-10 03:45:20
【问题描述】:

我有以下 mongodb 文档

 { 
    "_id" : ISODate("2016-01-04T23:00:11.000+0000"), 
    "value" : {
        "hour" : ISODate("2016-01-04T23:00:00.000+0000"), 
        "day" : ISODate("2016-01-04T00:00:00.000+0000"), 
        "time" : ISODate("2016-01-04T23:00:11.000+0000"), 
        "day_chan1" : 90.162, 
        "day_chan2" : 77.547, 
        "day_chan3" : 79.32, 
        "total_day_chan" : 247.029
    }
}
{ 
    "_id" : ISODate("2016-01-04T23:00:23.000+0000"), 
    "value" : {
        "hour" : ISODate("2016-01-04T23:00:00.000+0000"), 
        "day" : ISODate("2016-01-04T00:00:00.000+0000"), 
        "time" : ISODate("2016-01-04T23:00:23.000+0000"), 
        "day_chan1" : 90.167, 
        "day_chan2" : 77.549, 
        "day_chan3" : 79.322, 
        "total_day_chan" : 247.038
    }
}
{ 
    "_id" : ISODate("2016-01-04T23:00:35.000+0000"), 
    "value" : {
        "hour" : ISODate("2016-01-04T23:00:00.000+0000"), 
        "day" : ISODate("2016-01-04T00:00:00.000+0000"), 
        "time" : ISODate("2016-01-04T23:00:35.000+0000"), 
        "day_chan1" : 90.172, 
        "day_chan2" : 77.551, 
        "day_chan3" : 79.324, 
        "total_day_chan" : 247.047
    }
}

我想根据日期子文档对文档进行分组和排序,因此同一天的所有数据都将出现在一个数组中。

到目前为止,我尝试使用

.aggregate([{
                        '$sort': {
                            '_id': 1
                        }
                    },
                    {
                         '$group' : {
                             '_id': '$value.day',
                             'data': {                                    
                                 '$push' : '$value'
                             }
                         }

                    },                        
                    {
                        '$project': {
                            '_id' : 1,
                            'data':1
                        }
                    }
      ]);

但我注意到来自两个不同日期的数据进入同一个数组

这是我在其中一个数组中得到的内容

  { hour: Tue Jan 05 2016 00:00:00 GMT+0000 (GMT),
  day: Tue Jan 05 2016 00:00:00 GMT+0000 (GMT),
  time: Tue Jan 05 2016 00:00:12 GMT+0000 (GMT),
  day_chan1: 91.635,
  day_chan2: 78.274,
  day_chan3: 80.062,
  total_day_chan: 249.971 }
{ hour: Mon Jan 04 2016 23:00:00 GMT+0000 (GMT),
  day: Mon Jan 04 2016 00:00:00 GMT+0000 (GMT),
  time: Mon Jan 04 2016 23:00:11 GMT+0000 (GMT),
  day_chan1: 90.162,
  day_chan2: 77.547,
  day_chan3: 79.32,
  total_day_chan: 247.029 }

但理想情况下,这两个应该在单独的数组中

          [{ hour: Tue Jan 05 2016 00:00:00 GMT+0000 (GMT),
      day: Tue Jan 05 2016 00:00:00 GMT+0000 (GMT),
      time: Tue Jan 05 2016 00:00:12 GMT+0000 (GMT),
      day_chan1: 91.635,
      day_chan2: 78.274,
      day_chan3: 80.062,
      total_day_chan: 249.971 }, {
},{ hour: Tue Jan 05 2016 00:0:00 GMT+0000 (GMT),
      day: Tue Jan 05 2016 00:00:00 GMT+0000 (GMT),
      time: Tue Jan 05 2016 01:01:12 GMT+0000 (GMT),
      day_chan1: 91.635,
      day_chan2: 78.274,
      day_chan3: 80.062,
      total_day_chan: 249.971 }],
     [{ hour: Mon Jan 04 2016 23:00:00 GMT+0000 (GMT),
      day: Mon Jan 04 2016 00:00:00 GMT+0000 (GMT),
      time: Mon Jan 04 2016 23:00:11 GMT+0000 (GMT),
      day_chan1: 90.162,
      day_chan2: 77.547,
      day_chan3: 79.32,
      total_day_chan: 247.029 }]

同一天的所有文档将被收集到一个数组中

[Date1 的数组,Date2 的数组,date3 的数组] 等等。

【问题讨论】:

  • 你能告诉我们你的预期输出是什么,你从命令中得到了什么?
  • 我正在运行与您提供的相同的命令并获得正确的结果。
  • 我有 40,000 个文档,所以有时会出现错误。
  • 两天的数据被收集到同一个数组中。

标签: mongodb aggregation-framework


【解决方案1】:

您提供的示例文档日期相同。所以我更改了其中一个文档的日期,然后运行您提供的命令并得到以下结果。

{
    "_id" : ISODate("2016-01-05T00:00:00Z"),
    "data" : [
        {
            "hour" : ISODate("2016-01-05T23:00:00Z"),
            "day" : ISODate("2016-01-05T00:00:00Z"),
            "time" : ISODate("2016-01-05T23:00:11Z"),
            "day_chan1" : 90.162,
            "day_chan2" : 77.547,
            "day_chan3" : 79.32,
            "total_day_chan" : 247.029
        }
    ]
}
{
    "_id" : ISODate("2016-01-04T00:00:00Z"),
    "data" : [
        {
            "hour" : ISODate("2016-01-04T23:00:00Z"),
            "day" : ISODate("2016-01-04T00:00:00Z"),
            "time" : ISODate("2016-01-04T23:00:23Z"),
            "day_chan1" : 90.167,
            "day_chan2" : 77.549,
            "day_chan3" : 79.322,
            "total_day_chan" : 247.038
        },
        {
            "hour" : ISODate("2016-01-04T23:00:00Z"),
            "day" : ISODate("2016-01-04T00:00:00Z"),
            "time" : ISODate("2016-01-04T23:00:35Z"),
            "day_chan1" : 90.172,
            "day_chan2" : 77.551,
            "day_chan3" : 79.324,
            "total_day_chan" : 247.047
        }
    ]
}

所以在我看来我找不到任何问题。

【讨论】:

    猜你喜欢
    • 2015-11-25
    • 1970-01-01
    • 2015-11-17
    • 2014-08-14
    • 2022-01-25
    • 1970-01-01
    • 2014-06-23
    • 2011-02-19
    • 2019-01-19
    相关资源
    最近更新 更多