MongoDB Raw查询选择处于给定日期时间段的文档

时间:2017-04-12 04:38:51

标签: mongodb laravel mongodb-query laravel-5.3 php-5.6

我想选择用户指定日期时间段之间的文档,如:

 $normal_banners = BannerView::raw(function ($collection) use ($id, $from_date, $to_date) {
      $conditions = [
         ["camp_id" => ['$eq' => $id]],
         ['$or' => [
              ['seat_target_status' => ['$eq' => true]],
              ['seat_target_status' => ['$eq' => false]]
         ]],
         ['camp_target_status' => ['$eq' => false]],
         ];

         if ($from_date) {
            $conditions[] = ['created_at' => ['$gte' => $from_date]];
         }

         return $collection->aggregate([
            ['$match' => ['$and' => $conditions]],
         ]);
    })->count();

我使用laravel框架和jenssegers / laravel-mongodb mongodb驱动程序来运行我的查询,这是我的Raw查询:

   $normal_banners = BannerView::Where('camp_id', $id)
        ->where(function ($query) {$query->where('seat_target_status', true)->orWhere('seat_target_status', false);
           })
        ->where('camp_target_status', false)
        ->where("created_at", ">=", $from_date)
        ->count();

但我的问题是它返回0作为结果;虽然这段时间内有16份文件。

我已经尝试过这种方法来获取它们的数量,但仍然是0结果:

created_at

仅供参考:我已将输入的日期时间转换为ISODate,这是$Fromdatetime = $request->input('from_date'); $from_date = new DateTime($Fromdatetime); $from_date = $from_date->format(DateTime::ISO8601); 字段的mongodb数据类型。

 "updated_at": ISODate("2017-04-10T09:35:58.641Z"),
   "created_at": ISODate("2017-04-10T09:35:58.641Z")

mongodb字段数据类型是:

"2017-01-07T09:08:59+0000"

我的输入数据类型为:<header> <h1>Parse Test</h1> </header> <br> <p>Please enter facts:</p> <input id="inp" type="text"> <br> <br> <button type="button" onclick="pass()">Process</button> <br> <p id="iop"></p> <br> <script> function pass() { var lx = document.getElementById("inp").value; var tx = lx.replace(" ","<br>"); document.getElementById("iop").innerHTML = tx; } </script>

有什么建议吗?

2 个答案:

答案 0 :(得分:4)

你必须戴上牙套&#34;或者在原始查询中使用updated_at列测试$ to_date,但是在您使用created_at列进行的Eloquent代码中

var curried = _.curry(function)

答案 1 :(得分:4)

我使用Carbon :: createDateFrom方法解决了这个问题,它根据我的输入创建了一个UTC日期时间:

输入:

{
  "from_date": "2017-03-10",
  "to_date": "2017-04-09"
}

转换输入日期:

$from_date_arr = explode("-",$request->input('from_date'));
$from_date = Carbon::createFromDate($from_date_arr[0],$from_date_arr[1],$from_date_arr[2]);

$to_date_arr = explode("-",$request->input('to_date'));
$to_date = Carbon::createFromDate($to_date_arr[0],$to_date_arr[1],$to_date_arr[2]);

这是我运行的查询有效:

$normal_banners = BannerView::Where('camp_id', $id)
    ->where(function ($query) {$query->where('seat_target_status', true)->orWhere('seat_target_status', false);
         })
    ->where('camp_target_status', false)
    ->where("created_at", ">=",$from_date)
    ->where("created_at", "<=",$to_date)
    ->count();

jessenger驱动程序仍存在一个奇怪的问题,其中whereBetween不起作用,我们应该使用两个where子句来使其工作。

希望解决别人问题。