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

MongoDBのGroupBy複数の列

    以下の集計クエリに従ってください:

    db.shifts.aggregate([{ 
        //this get the day of week and converts them into sunday, saturday
        $project: {
            jobId:1,
            hourlyRate:1, 
            dayOfWeek: { $dayOfWeek: "$from" }, 
            workedHours: {$divide:[{ $subtract: ["$to", "$from"] }, 3600000]}, 
            saturday:{$floor: {$divide:[{ $dayOfWeek: "$from" }, 7]}},
            sunday:{$floor: {$divide:[{$abs:{$subtract:[{ $dayOfWeek: "$from" }, 7]}}, 6]}},
        }
    }, {
        //based on the values of sunday and saturday gets the value of weekday
        $project: {
            jobId:1,
            workedHours:1,
            hourlyRate:1,
            saturday:1,
            sunday: 1,
            weekday:{$abs: {$add:["$sunday","$saturday", -1]}},
        } 
    }, {
        //here calculates the earnings for each job
        $group:{
            _id:"$jobId",
            sundayEarnings:{$sum: {$multiply:["$sunday", "$hourlyRate", "$workedHours"]}},
            saturdayEarnings:{$sum: {$multiply:["$saturday", "$hourlyRate", "$workedHours"]}},
            weekdayEarnings:{$sum: {$multiply:["$weekday", "$hourlyRate", "$workedHours"]}},
            totalEarnings: {$sum:{$multiply:["$hourlyRate", "$workedHours"]}},
            totalWorkedHours: {$sum: "$workedHours"}
        }
    }, {
        //and finally calculates the total jobs earnings
        $group:{
            _id:null,
            jobs:{$push:{
                jobId: "$_id",
                sundayEarnings: "$sundayEarnings",
                saturdayEarnings: "$saturdayEarnings",
                weekdayEarnings: "$weekdayEarnings",
                totalEarnings: "$totalEarnings",
                totalWorkedHours: "$totalWorkedHours"
            }},
            totalJobsEarning: {$sum: "$totalEarnings"}
        }
    }])
    
    1. 最初の$project 集計により、0または1が得られます saturdayの値 およびsunday dayOfWeekに基づく いくつかの算術計算を行うことによる価値。
    2. 2番目の$project 集計により、weekdayが計算されます saturdayに基づくの値 およびsunday 値。
    3. 最初の$group 各ジョブの毎日の収益を計算します。
    4. 最後に2番目の$group 集計は、すべてのジョブの収益の合計を計算します。

    テスト

    これが私の意見です:

    {
        "_id" : ObjectId("5885a1108c2fc432d649647d"),
        "from" : ISODate("2017-01-24T06:21:00Z"),
        "to" : ISODate("2017-01-24T08:21:00Z"),
        "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
        "hourlyRate" : 32
    }
    {
        "_id" : ObjectId("5885a1108c2fc432d649647e"),
        "from" : ISODate("2017-01-25T06:21:00Z"),
        "to" : ISODate("2017-01-25T08:21:00Z"),
        "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
        "hourlyRate" : 32
    }
    {
        "_id" : ObjectId("5885a1108c2fc432d649647f"),
        "from" : ISODate("2017-01-26T06:21:00Z"),
        "to" : ISODate("2017-01-26T08:21:00Z"),
        "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
        "hourlyRate" : 32
    }
    {
        "_id" : ObjectId("58870cfd59dfb6b0c4eadd72"),
        "from" : ISODate("2017-01-28T06:21:00Z"),
        "to" : ISODate("2017-01-28T08:21:00Z"),
        "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
        "hourlyRate" : 32
    }
    {
        "_id" : ObjectId("58870dc659dfb6b0c4eadd73"),
        "from" : ISODate("2017-01-29T06:21:00Z"),
        "to" : ISODate("2017-01-29T08:21:00Z"),
        "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
        "hourlyRate" : 32
    }
    

    上記の集計クエリは、次の出力を提供します。

    {
        "_id" : null,
        "jobs" : [
            {
                "jobId" : ObjectId("586d7d6acfc7e05669d6e2c8"),
                "sundayEarnings" : 64,
                "saturdayEarnings" : 64,
                "weekdayEarnings" : 192,
                "totalEarnings" : 320,
                "totalWorkedHours" : 10 
            }
        ],
        "totalJobsEarning" : 320
    }
    

    jobsで 配列は、shiftsコレクションのドキュメントが同じjobIdを参照しているため、ジョブは1つだけです。 。別のjobIdでこれを試すことができます sそしてそれはあなたに総収入であなたに異なる仕事を与えるでしょう。



    1. mongodb crudクエリと集計クエリを一緒に記述できますか?

    2. node.jsからプログラムでmongodumpコマンドを実行するにはどうすればよいですか?

    3. PythonでMongoDBAtlas認証に失敗しました

    4. 認証が有効になっている状態でMongoDBに接続できません