在 Lumen 中使用 Mongo 查询
Use Mongo query in Lumen
我在我的项目中使用 jenssegers/laravel-mongodb 包。我的项目是用 Laravel Lumen 微框架开发的,现在我如何在 lumen
中使用 blow mongo 查询和 jenssegers/laravel-mongodb 包
db.orders.aggregate([
{
'$match': {
'status': 'suspend'
}
},
{
'$project':{
'min_diff': {
'$ceil': {
'$divide': [
{
'$subtract': [
new Date(),
'$created_at'
]
},
60 * 1000
]
}
}
}
},
{
'$match': {
'$or': [
{
'min_diff': {
'$gt': 5,
'$lte': 10
},
'latitude': {
'$gte': '{MIN_LAT}',
'$lte': '{MAX_LAT}'
},
'longitude': {
'$gte': '{MIN_LON}',
'$lte': '{MAX_LON}'
}
},
{
'min_diff': {
'$gt': 10,
'$lte': 15
},
'latitude': {
'$gte': '{MIN_LAT}',
'$lte': '{MAX_LAT}'
},
'longitude': {
'$gte': '{MIN_LON}',
'$lte': '{MAX_LON}'
}
}
]
}
}
])
注意:我的 Lumen 版本是 5.2,MongoDB 版本是 3.2
我发现这个解决方案有效:
$time_5_min_ago = Carbon::now()->subMinute(5);
$time_10_min_ago = Carbon::now()->subMinute(10);
$time_15_min_ago = Carbon::now()->subMinute(15);
$time_20_min_ago = Carbon::now()->subMinute(20);
return Order::where(function ($query) use ($maxLat_try_one,$minLat_try_one,$maxLon_try_one,$minLon_try_one,$time_5_min_ago,$time_10_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_one, $maxLon_try_one])
->whereBetween('source_latitude', [$minLat_try_one,$maxLat_try_one])
->where('status', '=', 'pending')
->where('created_at', '<', $time_5_min_ago)
->where('created_at', '>=', $time_10_min_ago);
})->orWhere(function ($query) use ($maxLat_try_two,$minLat_try_two,$maxLon_try_two,$minLon_try_two,$time_10_min_ago,$time_15_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_two, $maxLon_try_two])
->whereBetween('source_latitude', [$minLat_try_two,$maxLat_try_two])
->where('status', '=', 'pending')
->where('created_at', '<', $time_10_min_ago)
->where('created_at', '>=', $time_15_min_ago);
})->orWhere(function ($query) use ($maxLat_try_three,$minLat_try_three,$maxLon_try_three,$minLon_try_three,$time_15_min_ago,$time_20_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_three, $maxLon_try_three])
->whereBetween('source_latitude', [$minLat_try_three,$maxLat_try_three])
->where('status', '=', 'pending')
->where('created_at', '<', $time_15_min_ago)
->where('created_at', '>=', $time_20_min_ago);
})->get($fields);
我在我的项目中使用 jenssegers/laravel-mongodb 包。我的项目是用 Laravel Lumen 微框架开发的,现在我如何在 lumen
中使用 blow mongo 查询和 jenssegers/laravel-mongodb 包db.orders.aggregate([
{
'$match': {
'status': 'suspend'
}
},
{
'$project':{
'min_diff': {
'$ceil': {
'$divide': [
{
'$subtract': [
new Date(),
'$created_at'
]
},
60 * 1000
]
}
}
}
},
{
'$match': {
'$or': [
{
'min_diff': {
'$gt': 5,
'$lte': 10
},
'latitude': {
'$gte': '{MIN_LAT}',
'$lte': '{MAX_LAT}'
},
'longitude': {
'$gte': '{MIN_LON}',
'$lte': '{MAX_LON}'
}
},
{
'min_diff': {
'$gt': 10,
'$lte': 15
},
'latitude': {
'$gte': '{MIN_LAT}',
'$lte': '{MAX_LAT}'
},
'longitude': {
'$gte': '{MIN_LON}',
'$lte': '{MAX_LON}'
}
}
]
}
}
])
注意:我的 Lumen 版本是 5.2,MongoDB 版本是 3.2
我发现这个解决方案有效:
$time_5_min_ago = Carbon::now()->subMinute(5);
$time_10_min_ago = Carbon::now()->subMinute(10);
$time_15_min_ago = Carbon::now()->subMinute(15);
$time_20_min_ago = Carbon::now()->subMinute(20);
return Order::where(function ($query) use ($maxLat_try_one,$minLat_try_one,$maxLon_try_one,$minLon_try_one,$time_5_min_ago,$time_10_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_one, $maxLon_try_one])
->whereBetween('source_latitude', [$minLat_try_one,$maxLat_try_one])
->where('status', '=', 'pending')
->where('created_at', '<', $time_5_min_ago)
->where('created_at', '>=', $time_10_min_ago);
})->orWhere(function ($query) use ($maxLat_try_two,$minLat_try_two,$maxLon_try_two,$minLon_try_two,$time_10_min_ago,$time_15_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_two, $maxLon_try_two])
->whereBetween('source_latitude', [$minLat_try_two,$maxLat_try_two])
->where('status', '=', 'pending')
->where('created_at', '<', $time_10_min_ago)
->where('created_at', '>=', $time_15_min_ago);
})->orWhere(function ($query) use ($maxLat_try_three,$minLat_try_three,$maxLon_try_three,$minLon_try_three,$time_15_min_ago,$time_20_min_ago) {
$query->whereBetween('source_longitude', [$minLon_try_three, $maxLon_try_three])
->whereBetween('source_latitude', [$minLat_try_three,$maxLat_try_three])
->where('status', '=', 'pending')
->where('created_at', '<', $time_15_min_ago)
->where('created_at', '>=', $time_20_min_ago);
})->get($fields);