の間の時間のためのクエリは:のMongoDB:私は私のMongoDBに保存された次のスキーマで文書を持っている場合は2つの日付フィールド
{
createdDate: Date,
lastUpdate: Date
}
作成との間の期間の文書を照会することが可能です最終更新は例えば1日以上?
の間の時間のためのクエリは:のMongoDB:私は私のMongoDBに保存された次のスキーマで文書を持っている場合は2つの日付フィールド
{
createdDate: Date,
lastUpdate: Date
}
作成との間の期間の文書を照会することが可能です最終更新は例えば1日以上?
最良のオプションは、$redact
集約パイプラインステージを使用することです:
db.collection.aggregate([
{ "$redact": {
"$cond": {
"if": {
"$gt": [
{ "$subtract": [ "$lastUpdate", "$createdDate" ] },
1000 * 60 * 60 * 24
]
},
"then": "$$KEEP",
"else": "$$PRUNE"
}
}}
])
ですから、1日のミリ秒の値よりも大きい差からミリ秒の値を見ています。 $subtract
は差分の計算を行い、2つの日付を差し引くとミリ秒の差が返されます。
演算子は「if」という論理式をとり、その条件がtrue
の場合は、「then」のアクションを受け取ります。これは$$KEEP
です。それがfalse
の場合、文書は$$PRUNE
で結果から削除されます。
これは論理的な条件であり、設定値または値の範囲ではないため、「インデックス」は使用されないことに注意してください。
アグリゲーションパイプラインの操作はネイティブにコード化されているため、このような文を実行すると最も速く実行できます。
代替はJavaScript評価で$where
です。これは同様に、true
またはfalse
の値を返す必要のあるJavaScript関数式を取ります。 JavaScriptのevalutionが解釈を必要とし、.aggregate()
当量よりはるかに遅いを実行することを除いて、
db.collection.find(function() {
return (this.lastUpdate.valueOf() - this.createdDate.valueOf())
> (1000 * 60 * 60 * 24);
})
同じこと:シェルでは、次のように略記することができます。同様に、このタイプの式では、索引を使用してパフォーマンスを最適化することはできません。
の結果では、差異を文書に保存してください。次に、そのプロパティで直接クエリを実行するだけでなく、インデックスにもインデックスを付けることができます。
$expr(3.6 mongoバージョン演算子)を使用すると、定期的なクエリで集計関数を使用できます。
query operators
と対aggregation comparison operators
を比較します。
db.col.find({$expr:{$gt:[{"$subtract":["$lastUpdate","$createdDate"]},1000*60*60*24]}})
詳細な回答ありがとうございました!誰かがSQLから来ているので、私はそれがその冗長であるとは思わなかった... – zaphod1984