1

使用 PHP 脚本创建了一个 mongo 集合,其中的子字段使用 MongoDate 初始化。集合中的结果字段如下所示:

"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 字段,则搜索成功。

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

谢谢!

4

1 回答 1

2

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

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

于 2012-04-26T21:29:44.650 回答