Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
683 views
in Technique[技术] by (71.8m points)

date - MongoDB - group by month

I am writing a query in mongo db. I have a booking table and I want to get number of bookings in a month i.e. group by month. I am confused that how to get month from a date.

Here is my schema:

{
    "_id" : ObjectId("5485dd6af4708669af35ffe6"),
    "bookingid" : 1,
    "operatorid" : 1,
    "clientid" : null,
    "callername" : "Sayem Hussain",
    "contactno" : "0205661862",
    "regular" : 0,
    "bookingdetail" : [
        {
            "driverid" : 1,
            "pickupdatetime" : "2011-04-14 11:00:00",
            "from" : "white chapel",
            "to" : "beach",
            "cost" : 500,
            "journeytime" : 60
        },
        {
            "driverid" : 2,
            "pickupdatetime" : "2012-05-14 12:00:00",
            "from" : "walthamstow",
            "to" : "mile end",
            "cost" : 1000,
            "journeytime" : 50
        }
    ],
    "bookingdatetime" : "2012-10-11T07:00:00Z"
}
{
    "_id" : ObjectId("5485dd6af4708669af35ffe7"),
    "bookingid" : 2,
    "operatorid" : 1,
    "clientid" : 1,
    "callername" : null,
    "contactno" : "0205561281",
    "regular" : 1,
    "bookingdetail" : [
        {
            "driverid" : 3,
            "pickupdatetime" : "2012-02-12 09:00:00",
            "from" : "grange park",
            "to" : "queen mary",
            "cost" : 650,
            "journeytime" : 90
        },
        {
            "driverid" : 2,
            "pickupdatetime" : "2012-02-13 06:00:00",
            "from" : "drapers bar",
            "to" : "naveed restaurant",
            "cost" : 1350,
            "journeytime" : 120
        }
    ],
    "bookingdatetime" : "2014-07-26T05:00:00Z"
}
{
    "_id" : ObjectId("5485dd6af4708669af35ffe8"),
    "bookingid" : 3,
    "operatorid" : 2,
    "clientid" : 2,
    "callername" : null,
    "contactno" : "02565138632",
    "regular" : 1,
    "bookingdetail" : [
        {
            "driverid" : 2,
            "pickupdatetime" : "2013-11-23 06:00:00",
            "from" : "hussainabad",
            "to" : "lyari",
            "cost" : 2450,
            "journeytime" : 240
        },
        {
            "driverid" : 1,
            "pickupdatetime" : "2013-11-25 08:00:00",
            "from" : "garden",
            "to" : "defence",
            "cost" : 1800,
            "journeytime" : 30
        }
    ],
    "bookingdatetime" : "2014-03-17T11:00:00Z"
}

And this is I have tried:

db.booking.aggregate([{$group:{_id:new Date("$bookingdatetime").getMonth(), numberofbookings:{$sum:1}}}])

and it returns:

{ "_id" : NaN, "numberofbookings" : 3 }

Where am I going wrong ? Kindly assist me.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You need to use the $month keyword in your group. Your new Date().getMonth() call will only happen once, and will try and create a month out of the string "$bookingdatetime".

db.booking.aggregate([
    {$group: {
        _id: {$month: "$bookingdatetime"}, 
        numberofbookings: {$sum: 1} 
    }}
]);

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

2.1m questions

2.1m answers

60 comments

56.9k users

...