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

mongofindメソッドで2つの日付を比較する

    MongoDB 3.6以降の場合:

    $ expr 演算子を使用すると、クエリ言語内で集計式を使用できるため、 $ dateToString 日付フィールドを変換する演算子:

    db.test.find({ 
        "$expr": { 
            "$ne": [ 
                 { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                 { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
            ] 
        } 
    })
    

    または、 $で集計フレームワークを使用します一致 パイプライン

    db.test.aggregate([
        { "$match": { 
            "$expr": { 
                "$ne": [ 
                    { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                    { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
                ] 
            } 
        } }
    ])
    

    MongoDB 3.0以降の場合:

    で集計フレームワークを使用することもできます $ redact $ cond 演算子を使用し、特別な操作を使用します $$ KEEP 論理条件が真または $$ PRUNE 条件がfalseであったドキュメントを「削除」します。

    上記の概念を示す次の集約操作を実行することを検討してください。

    db.test.aggregate([
        {
            "$redact": {
                "$cond": [
                    { 
                        "$ne": [ 
                            { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                            { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
                        ] 
                    },
                    "$$KEEP",
                    "$$PRUNE"
                ]
            }
        }
    ])
    

    この操作は、 $ project コレクション内のフィールドを選択し、論理条件クエリの結果を保持する新しいフィールドを作成し、その後に続く $ match ただし、 $ redact より効率的な単一のパイプラインステージを使用します:

    db.test.aggregate([
        {
            "$project": { 
                "created": 1, 
                "last_active": 1,
                "sameDay": { 
                    "$cond": [ 
                        { 
                            "$eq": [ 
                                {"$substr" : ["$last_active",0, 10]}, 
                                {"$substr" : ["$created",0, 10]}
                            ] 
                        }, true, false 
                    ]
                } 
            } 
        },
        { "$match": { "sameDay": false } }
    ])
    

    0r

    db.test.aggregate([
        {
            "$project": { 
                "created": 1, 
                "last_active": 1,
                "sameDay": { 
                    "$cond": [ 
                        { 
                            "$eq": [ 
                                { "$dateToString": { "format": "%Y-%m-%d", "date": "$created" } }, 
                                { "$dateToString": { "format": "%Y-%m-%d", "date": "$last_active" } }
                            ] 
                        }, true, false 
                    ]
                } 
            } 
        },
        { "$match": { "sameDay": false } }
    ])
    

    もう1つのアプローチは、 $where<を使用することです。 / code> find()の演算子 メソッドですが、 <を使用しているため、クエリがかなり遅くなることに注意してください。 code> $ where 単独でテーブルスキャンが必要であり、データベースはコレクション内の各ドキュメントに対してJavaScript式または関数を実行するため、可能であればインデックス付きクエリと組み合わせて、標準のMongoDB演算子( <など)を使用して表現するとクエリのパフォーマンスも向上します。 code> $ gt $ in ):

    db.test.find({ 
       "$where": function() { 
           return this.created.getDate() !== this.last_active.getDate() 
       } 
    });
    

    以上コンパクト:

    db.test.find({ "$where": "this.created.getDate() !== this.last_active.getDate()" });
    

    入力あり:

    /* 0 */
    {
        "_id" : 1,
        "created" : ISODate("2014-12-19T06:01:17.171Z"),
        "last_active" : ISODate("2014-12-21T15:38:13.842Z")
    }
    
    /* 1 */
    {
        "_id" : 2,
        "created" : ISODate("2015-07-06T12:17:32.084Z"),
        "last_active" : ISODate("2015-07-06T18:07:08.145Z")
    }
    
    /* 2 */
    {
        "_id" : 3,
        "created" : ISODate("2015-07-06T06:01:17.171Z"),
        "last_active" : ISODate("2015-07-07T10:04:30.921Z")
    }
    
    /* 3 */
    {
        "_id" : 4,
        "created" : ISODate("2015-07-06T06:01:17.171Z"),
        "last_active" : ISODate("2015-07-06T09:47:44.186Z")
    }
    
    /* 4 */
    {
        "_id" : 5,
        "created" : ISODate("2013-12-19T06:01:17.171Z"),
        "last_active" : ISODate("2014-01-20T13:21:37.427Z")
    }
    

    集計は次を返します:

    /* 0 */
    {
        "result" : [ 
            {
                "_id" : 1,
                "created" : ISODate("2014-12-19T06:01:17.171Z"),
                "last_active" : ISODate("2014-12-21T15:38:13.842Z"),
                "sameDay" : false
            }, 
            {
                "_id" : 3,
                "created" : ISODate("2015-07-06T06:01:17.171Z"),
                "last_active" : ISODate("2015-07-07T10:04:30.921Z"),
                "sameDay" : false
            }, 
            {
                "_id" : 5,
                "created" : ISODate("2013-12-19T06:01:17.171Z"),
                "last_active" : ISODate("2014-01-20T13:21:37.427Z"),
                "sameDay" : false
            }
        ],
        "ok" : 1
    }
    


    1. 文字列の「Like」に対するMongoDBC#クエリ

    2. トランザクションはmongodbアグリゲーション$mergeで機能しますか?

    3. Mongooseを使用してMongoDBトランザクションを使用するにはどうすればよいですか?

    4. インデックスで使用されているフィールドを変更した場合、mongodbはインデックスを再作成しますか?