1

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フィールドを検索すると、検索は成功します。

助言がありますか?私は何が欠けていますか?木から3インチのところに立っていると、森が見えないことについて不平を言っているような気がします...

ありがとう!

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 に答える