TSが5日以内のレコードを返すPerl Mongo Find()を返す方法
質問
私はClickStreamというMongoDBコレクションを持っており、過去5日間のタイムスタンプで特定のPubcodeに一致するすべての文書を見つけたいです。 タイムスタンプはTSと呼ばれるフィールド内にあり、日付のMongoデータ型があります。
Mongoシェルから、次のように実行できます。 -
db.Clickstream.find({
pubCode : "w_abc123",
ts: {$gte: ISODate("2014-02-28T00:00:00Z")}
})
.
しかし、私はPerlで同じことをすることはできません(ハードコードされた日付と時刻ではなく、今日の日付を使用して)。私がこれを行うなら: -
my $now = DateTime->now;
my $n_days_ago = $now->add( days => -5 );
... etc ...
my $ptr = $ptrClickstream->find(
{
pubCode => "$pubCode",
ts => { "\$gte" => ISODate("$n_days_ago") }
},
{ hitType => 1 }
);
.
次のエラーメッセージを入手します。 -
未定義のサブルーチン&Main :: IsodateはRecalcpuppop.pm 25号線で呼び出されます。
そしてこの
のようにiSodata()への参照を削除した場合 my $ptr = $ptrClickstream->find({
pubCode => "$pubCode", ts => { "\$gte" => "$n_days_ago" }
});
.
文書が返されない。
tsが5日以内のレコードを返す方法についての提案は? ありがとう!
解決
日時自然に使用します。全体を説明するだけです。
だから、Mongoシェルの中からISODate
のフォームを見ると、それは実際に実際にだけです。
Perlドライバ "" これらの値は DATETIME それらを取得するとき、そして同様の方法で、値を渡したときのBSONの日付への変換を処理します。
だからあなたはすでに datetime 数学の部分あなたのコード:
my $now = DateTime->now;
my $n_days_ago = $now->add( days => -5 );
.
参照のために->add
は「インプレース」で、その日の「スタート」を望んでいて切り捨てることができます。
「UTC」の日付を試して、それは彼らが一般的にそのようになるべきであるので完全性のためだけにコレクションの中にあるものです。あなたはあなたの日付をビットクリーナーにコーディングするこの形式を見つけるかもしれません:
my $then = DateTime->now( time_zone => 'UTC' )
->truncate( to => 'day' )->add( days => -5 );
.
とあなたの2番目のクエリフォームは一般的に正しいですが、あなたの本当の問題あなたは"$n_days_ago"
と同じように補間することによって文字列に強制されていました、それであなたはオブジェクトを持っていませんでした。私が修正したようにフォームを見て、あなたが本当に意味を持たない限り補間しようとしないでください:
my $ptr = $ptrClickstream->find({
pubCode => $pubCode, ts => { '$gte' => $then }
});
.
だから私にとってはすべてうまくいきます。それが結果を返さないのなら、それらの値が間違いなくあなたが期待するものであることをあなたのvars
をチェックします。
全てのドライバ実装は、このようにしてそれらの言語のネイティブの「日付オブジェクト」を処理します。
詳細については、日付