如何比较日期与mongodb的iso日期在mongodb雄辩查询


How to compare date with mongodb iso date in laravel mongodb eloquent query?

我想从数据中获取日期大于给定日期的记录。但是我在比较日期与mongodb iso datetime时遇到了问题。

目前我得到的日期在Y-m-d格式,我想在查询和日期在mongodb是在2015-10-08T08:01:46.000Z格式比较。

Laravel的Eloquent支持Carbon/DateTime对象而不是MongoDate对象,后者在保存到数据库时将在内部转换为MongoDate对象。您可以使用laravel中的日期处理包Carbon来处理您的查询。

例如,如果你想从用户数据中查询mongodb datetime字段created_at大于给定日期的记录,例如今天的记录,使用Carbon的 startOfDay() 属性:

$dt = Carbon::now()->startOfDay();
$users = User::where('created_at', '>', $dt)->get();
同样,要执行数据范围查询,即查询特定月份之间的记录,例如2015年10月,使用 whereBetween 方法:
$users = User::whereBetween(
             'created_at', array(
                 Carbon::createFromDate(2015, 10, 1),
                 Carbon::createFromDate(2015, 10, 31)
             )
         )->get();

另一种方法是使用Eloquent,它允许您使用Carbon/DateTime对象而不是MongoDate对象。灵感来自文档的例子:

<?php
use Jenssegers'Mongodb'Model as Eloquent;
class User extends Eloquent {
    use SoftDeletingTrait;
    /**
     * Collection for Model
     *
     * @var String
     */
    protected $collection = "users";
    /**
     * Connection for model
     *
     * @var type
     */
    protected $connection = 'mongodb';
    protected $dates = array('created_at');
}

允许您执行如下查询:

$users = User::where('created_at', '>', new DateTime('-1 day'))->get();

或者本机使用MongoDate对象,您可以尝试

$start = new MongoDate(strtotime("2015-10-01 00:00:00"));
$stop = new MongoDate(strtotime("2015-10-31 00:00:00"));
$users = DB::collection('users')->whereBetween('created_at', array($start, $stop))->get();

比较日期最简单的方法是使用Carbon。

例如,如果你想从Y-m-d得到

你可以这样写:

$dt = Carbon::createFromDate(2017,11,7);

式中2017 =年,11 =月,7 =日。根据您需要的日期更换。

如果你想获取当前时间之前的数据,你可以使用

$dt = Carbon::now()

如果你想从当前月的第一天开始获取数据,你只需要这样做:

$dt = Carbon::now()->startOfMonth();

下面是我在代码中使用的一个示例:

$device_data = DB::connection('mongodb')
->table('MyRecipe')
->where('data_date', '>', $dt)
->select('*')
->get();

我使用https://github.com/jenssegers/laravel-mongodb访问我的Mongo数据库