MongoDB Group通过'$ group'问题在日期上获得聚合函数中的记录,我们在Tabel DB中具有datetime格式

时间:2018-12-24 15:23:17

标签: mongodb mongodb-query aggregation-framework codeigniter-3

我在使用codeignitor3的mongo db上遇到问题,无法使用“ $ group”中的group by group by在创建时按日期创建记录,但是在表USER_DATA mongoDb数据库中有datetime格式。 当我运行mongo查询时,出现错误“无法从BSON类型的字符串转换为日期”

$date = date('Y-m-d',strtotime(-1 month));
$users = $this->common_model->aggregate($this->database['USER_DATA'], array(array('$match' => array('created' => array('$gte' => $date))),
        array('$sort' => array('_id.created' => -1)),
        array('$group' => array('_id' => array('year' => array('$year' => '$created'), 'month' => array('$month' => '$created'), 'day' => array('$dayOfMonth' => '$created')), 'count' => array('$sum' => 1))),
        ));

在使用之前

array('$group' => array('_id' => array('created' => '$created')), 'count' => array('$sum' => 1)),

它工作正常,但按日期记录的分组不符合要求,因为在DB表中,我们具有datetime格式。 它们对带有codeignitor库函数的mongo查询有什么影响吗?

2 个答案:

答案 0 :(得分:0)

请仔细阅读Date conversions的Mongodb文档。

var project = {
            "$project":{ 
                "_id": 0,
                "y": {
                    "$year": ISODate("$created").getFullYear() 
                    },
                "m": {
                    "$month": ISODate("$created").getMonth()+1 // months start from 0
                }, 
                "d": {
                    "$dayOfMonth":  ISODate("$created").getDate()
                }
            } 
        },
        group = {   
            "$group": { 
                "_id": { 
                    "year": "$y", 
                    "month": "$m", 
                    "day": "$d"
                },  
                "count" : { "$sum" : "$users" } //Users count
            }
        };

答案 1 :(得分:0)

现在我做了一个替代选择,那就是我在表名"created_date": "2019-01-10"中创建了另一个字段,并使用“ created_date”及其正常工作进行了分组。

$date = date('Y-m-d H:i:s',strtotime(-1 month));
$users = $this->common_model->aggregate($this->database['USER_DATA'], array(array('$match' => array('created' => array('$gte' => $date))),
        array('$sort' => array('_id.created' => -1)),
        array('$group' => array('_id' => array('created_date' => '$created_date')), 'count' => array('$sum' => 1)),
        )); 

但是我想要的是我提出问题的方式,因为有时我们不能仅仅为此做一个新的额外字段,这就是为什么我尝试我提出问题的选项的原因,我希望将来能得到该解决方案太。谢谢大家:)