【问题标题】:Laravel Mongodb Raw mongo query with dateLaravel Mongodb Raw mongo 查询日期
【发布时间】:2016-05-21 19:51:05
【问题描述】:

我正在使用 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',

                    ]
                ]
            ]);
        });

我该怎么办?

【问题讨论】:

标签: php mongodb laravel jenssegers-mongodb


【解决方案1】:

这对我有用:

$start = new \MongoDB\BSON\UTCDateTime(new \DateTime("-8 days"));

【讨论】:

    【解决方案2】:

    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") }
    • 调试管道的一种方法是只使用第一个管道运算符运行聚合。如果这给出了预期的结果,请添加下一个。在上面的答案中,您首先尝试仅聚合 $match;如果可行,请添加$group。这可以帮助您缩小导致问题的运营商的范围。
    • 另外,为了帮助您进行调试,只需检查这些日期变量是否为您提供了正确的日期以及检查您的实际 MongoDB 日期。
    • 匹配运算符导致问题
    • 能否通过更改范围查询中的日期变量来调试$match 运算符,查看某些日期是否匹配?
    【解决方案3】:

    试试这个选项:

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

    看看,是否可行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-15
      • 1970-01-01
      • 2012-11-15
      • 2023-02-21
      • 2021-08-17
      • 1970-01-01
      • 2019-03-06
      相关资源
      最近更新 更多