使用带有使用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字段,搜索成功。
有什么建议吗?我错过了什么?感觉我站在离树三英寸的地方,抱怨我怎么没看到森林......
谢谢!
答案 0 :(得分:2)
mongod以JavaScript格式打印所有内容,以毫秒(这是所有额外的0来自的地方)打印日期。所以正确查询1335337200会变成1335337200 * 1000 = 1335337200000。
但是,您粘贴的初始文档片段看起来不对。 "ts_add" : {"sec" : 1335468966, "usec" : 420000}
是JSON,但Date类型不应该像JavaScript中那样。你是如何保存日期的?看起来它们被转换为另一种类型的对象,然后存储为“通用对象”而不是“日期类型”。