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

MongoDB/Mongoose-日付によるオブジェクトの配列のクエリ

    を使用して、集計パイプラインを実行できます。 $filter valuesの演算子 配列。次のmongoシェルクエリはこれを示しています:

    var start = new Date("2016-10-28T07:00:00.000Z"),
        end = new Date("2016-11-03T07:00:00.000Z");
    
    db.metrics.aggregate([
        { 
            "$match": { 
                "name": "Hello",
                "values.date": { "$gt": start, "$lt": end }
            } 
        },
        {
            "$project": {
                "name": 1,
                "values": {
                    "$filter": {
                        "input": "$values",
                        "as": "value",
                        "cond": { 
                            "$and": [
                                { "$gt": [ "$$value.date", start ] },
                                { "$lt": [ "$$value.date", end ] }
                            ]
                        }
                    }
                }
            }
        }
    ])
    

    サンプル出力

    /* 1 */
    {
        "_id" : ObjectId("5845453145fda1298fa50db9"),
        "name" : "Hello",
        "values" : [ 
            {
                "value" : 1568,
                "date" : ISODate("2016-10-29T07:00:00.000Z"),
                "_id" : ObjectId("58453abfef7aaa15ac1fdee7")
            }, 
            {
                "value" : 1547,
                "date" : ISODate("2016-10-30T07:00:00.000Z"),
                "_id" : ObjectId("58453abfef7aaa15ac1fdee6")
            }, 
            {
                "value" : 1497,
                "date" : ISODate("2016-10-31T07:00:00.000Z"),
                "_id" : ObjectId("58453abfef7aaa15ac1fdee5")
            }, 
            {
                "value" : 3031,
                "date" : ISODate("2016-11-01T07:00:00.000Z"),
                "_id" : ObjectId("58453abfef7aaa15ac1fdee4")
            }, 
            {
                "value" : 2559,
                "date" : ISODate("2016-11-02T07:00:00.000Z"),
                "_id" : ObjectId("58453abfef7aaa15ac1fdee3")
            }
        ]
    }
    

    MongoDB 3.0の場合、次の回避策が適用されます。

    var start = new Date("2016-10-28T07:00:00.000Z"),
        end = new Date("2016-11-03T07:00:00.000Z");
    
    db.metrics.aggregate([
        { 
            "$match": { 
                "name": "Hello",
                "values.date": { "$gt": start, "$lt": end }
            } 
        },
        {
            "$project": {
                "name": 1,
                "values": {
                    "$setDifference": [
                        {
                            "$map": {
                                "input": "$values",
                                "as": "value",
                                "in": {
                                    "$cond": [
                                        { 
                                            "$and": [
                                                { "$gt": [ "$$value.date", start ] },
                                                { "$lt": [ "$$value.date", end ] }
                                            ]
                                        },
                                        "$$value",
                                        false
                                    ]
                                }
                            }
                        },
                        [false]
                    ]
                }
            }
        }
    ])
    


    1. MongoNetworkError:最初の接続でサーバー[localhost:27017]への接続に失敗しました[MongoNetworkError:connect ECONNREFUSED 127.0.0.1:27017]

    2. MongoDBでネストされたドキュメントを再帰的にトラバースする方法

    3. hadoopのmongo'sout:reduceオプションに相当します

    4. MongoDBコレクション内のすべてのドキュメントに対して単一のフィールドを選択するにはどうすればよいですか?