MongoDB 对给定日期时间段内的 select 文档的原始查询
MongoDB Raw query to select documents which are in given datetime period
我想要 select 用户给定日期时间段内的文档,例如:
$from_date : "2017-01-07 09:08:59" To `$to_date : "2017-08-09 09:08:59"`
我正在使用 laravel 框架和 jenssegers/laravel-mongodb mongodb 驱动程序来 运行 我的查询,这是我的原始查询:
$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();
但我的问题是结果 returns 0;而这段时间有16个文件。
我试过这种方法来计算它们的数量,但结果仍然是 0 :
$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();
仅供参考:我已将输入的日期时间转换为 ISODate,这是 created_at
字段的 mongodb 数据类型。
$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")
我的输入数据类型是:"2017-01-07T09:08:59+0000"
有什么建议吗?
您必须使用 "put in braces" orWhere 函数,并且在您的原始查询中,您正在使用 updated_at 列测试 $to_date,但在 Eloquent 代码中,您正在使用created_at列
$targeted_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("updated_at", "<=", $to_date)
->count();
我已经使用 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 子句使其工作。
希望能解决别人的问题。
我想要 select 用户给定日期时间段内的文档,例如:
$from_date : "2017-01-07 09:08:59" To `$to_date : "2017-08-09 09:08:59"`
我正在使用 laravel 框架和 jenssegers/laravel-mongodb mongodb 驱动程序来 运行 我的查询,这是我的原始查询:
$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();
但我的问题是结果 returns 0;而这段时间有16个文件。
我试过这种方法来计算它们的数量,但结果仍然是 0 :
$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();
仅供参考:我已将输入的日期时间转换为 ISODate,这是 created_at
字段的 mongodb 数据类型。
$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")
我的输入数据类型是:"2017-01-07T09:08:59+0000"
有什么建议吗?
您必须使用 "put in braces" orWhere 函数,并且在您的原始查询中,您正在使用 updated_at 列测试 $to_date,但在 Eloquent 代码中,您正在使用created_at列
$targeted_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("updated_at", "<=", $to_date)
->count();
我已经使用 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 子句使其工作。
希望能解决别人的问题。