使用Laravel和MongoDB原始查询如何查询日期?

6

我正在使用laravel 5.1和jessenger mongodb包进行工作。我正在使用原始查询来获取数据,但我不知道如何在查询中使用日期,因为目前它返回空结果。

 $resultSet = DB::connection('mongodb')->collection('wc_mycollection')->raw(function ($collection){
            return $collection->aggregate([
                [
                    '$match'=>[
                        'created_at'=>[
                            '$gte' => Previous day midnight,
                            '$lt' => Current Time
                        ]
                    ]
                ],
                [
                    '$group' => [
                        '_id' => '$some_id',

                    ]
                ]
            ]);
        });

我该怎么办?


在分配日期参数后,打印查询并查看日期参数是否正确设置,如果是,则尝试将该时间戳转换为基于Mongo的时间格式。请参阅:https://docs.mongodb.org/v3.0/core/shell-types/#mongo-shell-date-type - Gaurav Dave
3个回答

1
这对我有用:
$start = new \MongoDB\BSON\UTCDateTime(new \DateTime("-8 days"));

1
在laravel中有一个非常好的日期处理包叫做Carbon,您可以将其与查询一起使用。如果您想要获取从今天开始的记录,请使用Carbon的startOfDay()属性或者获取前一天午夜的日期,请使用Carbon::yesterday()->endOfDay()
将所有这些组合起来,您可以构建您的管道如下:
$previousDayMidnight = Carbon::yesterday()->endOfDay(); // or $startOfToday = Carbon::now()->startOfDay()
$currentTime = Carbon::now();
$result = DB::collection('wc_mycollection')->raw(function($collection)
{
    return $collection->aggregate(array(
        array(
            '$match' => array(
                'created_at' => array(
                    '$gte' => $previousDayMidnight, // or $startOfToday
                    '$lt' => $currentDateTime
                )
            )
        ),
        array(
            '$group' => array(
                '_id' => '$some_id',
                'count' => array(
                    '$sum' => 1
                )
            )
        )   
    ));
});

另一种方法是原生使用MongoDate对象,您可以尝试。
$start = new MongoDate(strtotime(date('Y-m-d H:i:s', '-1 days')));
$end = new MongoDate(strtotime(date('Y-m-d H:i:s')));
$result = DB::collection('wc_mycollection')->raw(function($collection)
    {
        return $collection->aggregate(array(
            array(
                '$match' => array(
                    'created_at' => array(
                        '$gte' => $start, 
                        '$lt' => $end
                    )
                )
            ),
            array(
                '$group' => array(
                    '_id' => '$some_id',
                    'count' => array(
                        '$sum' => 1
                    )
                )
            )   
        ));
    });

我得到了一个空集合。我的集合看起来像这样:{ "_id" : ObjectId("55e6eff42f706e30047b23c8"), "war_id" : 3, "topic_id" : 5, "point_id" : 7, "point" : 1, "comment_id" : "55e6efdd2f706e0d047b23ca", "user_id" : 11, "upvote_id" : 3, "updated_at" : ISODate("2015-09-02T12:47:48.191Z"), "created_at" : ISODate("2015-09-02T12:47:48.191Z") } - Sameer Sheikh
你可以通过仅运行管道的第一个操作符来调试给出意外结果的管道。如果得到了预期的结果,就添加下一个操作符。在上面的答案中,你首先尝试仅聚合 $match;如果成功,再添加 $group。这可以帮助你缩小引起问题的操作符范围。 - chridam
此外,为了帮助您进行调试,请检查这些日期变量是否提供了正确的日期,并与实际的MongoDB日期进行比较。 - chridam
匹配运算符导致了问题。 - Sameer Sheikh
你能否通过更改范围查询中的日期变量来调试$match运算符,看看是否有一些日期匹配? - chridam
显示剩余2条评论

1
尝试这个选项:

'$match'=>[
      'created_at'=>[
             '$gte' => new Date("2016-10-02T00:00:00.000Z"),
             '$lt' => new Date("2016-11-02T00:00:00.000Z")
      ]
]

看看,如果这个有效。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接