2016-03-23 5 views

答えて

6

最良のオプションは、$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); 
}) 

同じこと:シェルでは、次のように略記することができます。同様に、このタイプの式では、索引を使用してパフォーマンスを最適化することはできません。

の結果では、差異を文書に保存してください。次に、そのプロパティで直接クエリを実行するだけでなく、インデックスにもインデックスを付けることができます。

+0

詳細な回答ありがとうございました!誰かがSQLから来ているので、私はそれがその冗長であるとは思わなかった... – zaphod1984

0

$expr(3.6 mongoバージョン演算子)を使用すると、定期的なクエリで集計関数を使用できます。

query operatorsと対aggregation comparison operatorsを比較します。

db.col.find({$expr:{$gt:[{"$subtract":["$lastUpdate","$createdDate"]},1000*60*60*24]}}) 
関連する問題