最良のオプションは、$redact
を使用することです 集約パイプラインステージ:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
つまり、1日のミリ秒値よりも大きい差からのミリ秒値を見ていることになります。 $subtract
差の計算を行い、2つの日付を引くと、ミリ秒単位の差が返されます。
$redact
演算子は論理式を「if」と見なし、その条件はtrue
です。 $$KEEP
への「then」でアクションを実行します ドキュメント。 false
の場合 次に、ドキュメントは$$PRUNE
を使用して結果から削除されます 。
これは論理的な条件であり、設定値や値の範囲ではないため、「インデックス」は使用されないことに注意してください。
アグリゲーションパイプラインの操作はネイティブにコーディングされているため、これは、このようなステートメントの最速の実行です。
別の方法は、$where
を使用したJavaScript評価です。 。これは、同様にtrue
を返す必要があるJavaScript関数式を取ります またはfalse
価値。シェルでは、次のように省略できます:
db.collection.find(function() {
return ( this.lastUpdate.valueOf() - this.createdDate.valueOf() )
> ( 1000 * 60 * 60 * 24 );
})
JavaScriptの評価には解釈が必要であり、.aggregate()
よりも実行速度がはるかに遅いことを除いて、同じことです。 同等。同様に、このタイプの式では、インデックスを使用してパフォーマンスを最適化することはできません。
最高の場合 結果は、ドキュメントに違いを保存します。次に、そのプロパティを直接クエリするだけで、もちろんインデックスを作成することもできます。