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

複数の日付範囲の$groupを集計します

    現在の日付が範囲内のどこにあるかに基づいて、グループ化キーを条件付きで決定する必要があります。これは基本的に、 $ condを介して実現されます。 ネストされた条件と $lt<の論理バリアント/ code> :

    // work out dates somehow
    var today = new Date(),
        oneDay = ( 1000 * 60 * 60 * 24 ),
        thirtyDays = new Date( today.valueOf() - ( 30 * oneDay ) ),
        fifteenDays = new Date( today.valueOf() - ( 15 * oneDay ) ),
        sevenDays = new Date( today.valueOf() - ( 7 * oneDay ) );
    
    db.collection.aggregate([
        { "$match": {
            "date": { "$gte": thirtyDays }
        }},
        { "$group": {
            "_id": {
                "$cond": [
                    { "$lt": [ "$date", fifteenDays ] },
                    "16-30",
                    { "$cond": [
                        { "$lt": [ "$date", sevenDays ] },
                        "08-15",
                        "01-07"
                    ]}
                ]
            },
            "count": { "$sum": 1 },
            "totalValue": { "$sum": "$value" }
        }}
    ])
    

    $ condとして が三項演算子の場合、最初の条件が評価されて条件がtrueかどうかが確認され、trueの場合は2番目の引数が返され、そうでない場合はfalseの場合に3番目の引数が返されます。したがって、別の $ condをネストすることによって 誤ったケースでは、日付がどこにあるかについて論理テストを行います。「15日未満の日付」は最も古い範囲を意味し、「7日未満」は中間の範囲を意味します。もちろん、最新の範囲。

    ここでは、10未満の数字の前に 0を付けています。 $ group の「keys」の出力なので、必要に応じて並べ替えることができます。 それ自体は注文されていません。

    しかし、それが単一のクエリでこれを行う方法です。日付がどこにあるかに基づいてグループ化キーを決定し、各キーについて累積するだけです。



    1. SQLで短い月の名前を取得する方法

    2. タイプ情報をMongoDBに渡して、インターフェイスタイプを適切に逆シリアル化できるようにしますか?

    3. InsertManyを使用すると、CosmosDbのリクエスト率が高くなります

    4. マングース検索を使用して文字列の一部を含むすべての値を取得するにはどうすればよいですか?