PHP和MongoDate查询

时间:2012-04-26 20:49:30

标签: php date mongodb

使用带有使用MongoDate初始化的子字段的PHP脚本创建mongo集合。集合中的结果字段如下所示:

"ts_add" : {
    "sec" : 1335468966,
    "usec" : 420000
},

当我在PHP中构建我的查询时,我正在构建它:

$val = new MongoDate(strtotime($strDate)); //  $strDate = '2012-04-25'
...
$aryQuery = array(STRING_COL_NAME => array ('$gte' => $val));

然后我做了一些其他的事情并用find()命令执行查询。

根据调试器的说法,PHP中的构建查询结构如下所示:

find(Array
(
    [ts_add] => Array
        (
            [$gte] => MongoDate Object
                (
                    [sec] => 1335337200
                    [usec] => 0
                )

        )
)

在我的日志文件中,我看到了:

runQuery called coll.table { ts_add: { $gte: new Date(1335337200000) } }

但是没有数据被返回....而且我有点被所有额外的零所包围,但我认为这是默认的时间戳数据或一些奇怪的MongoDate-ism ......

如果我手动,从cli运行此命令:

> db.table.find({ "ts_add.sec": { $gte:1335337200 } })

返回完整的数据集(如预期)。

然后,从cli尝试模仿MongoDate的事情:

> var start = new Date(2012, 3, 10)
> db.addons_add.find({ ts_add : { $gte : start } } )

没有数据返回。

如果我使用相同的输入数据并将其转换为MongoID,则搜索$ _id字段,搜索成功。

有什么建议吗?我错过了什么?感觉我站在离树三英寸的地方,抱怨我怎么没看到森林......

谢谢!

1 个答案:

答案 0 :(得分:2)

mongod以JavaScript格式打印所有内容,以毫秒(这是所有额外的0来自的地方)打印日期。所以正确查询1335337200会变成1335337200 * 1000 = 1335337200000。

但是,您粘贴的初始文档片段看起来不对。 "ts_add" : {"sec" : 1335468966, "usec" : 420000}是JSON,但Date类型不应该像JavaScript中那样。你是如何保存日期的?看起来它们被转换为另一种类型的对象,然后存储为“通用对象”而不是“日期类型”。