sql >> データベース >  >> NoSQL >> MongoDB

mongodb:2つの日付フィールド間の期間のクエリ

    最良のオプションは、$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()よりも実行速度がはるかに遅いことを除いて、同じことです。 同等。同様に、このタイプの式では、インデックスを使用してパフォーマンスを最適化することはできません。

    最高の場合 結果は、ドキュメントに違いを保存します。次に、そのプロパティを直接クエリするだけで、もちろんインデックスを作成することもできます。



    1. mongodbデータベースが存在するかどうかを確認しますか?

    2. Laravel Redis ::scan('*')が期待されるキーを返すのに、Redis ::keys(' *')が返さないのはなぜですか?

    3. アプリケーションキャッシュv.s.休止状態の第2レベルのキャッシュ、どちらを使用しますか?

    4. ClusterControlを使用してMongoDBを自動化および管理する方法