Home > Software engineering >  MongoDB Aggregation leap-year
MongoDB Aggregation leap-year

Time:01-01

I am learning MongoDB NoSQL, and I have a problema about it.

Consider these documents:

{
    "_id" : ObjectId("63a994974ac549c5ea982d2b"),
    "title" : "Destroyer",
    "year" : 2018
},
{
    "_id" : ObjectId("63a994974ac549c5ea982d2a"),
    "title" : "Aquaman",
    "year" : 2014
},

{
    "_id" : ObjectId("63a994974ac549c5ea982d29"),
    "title" : "On the Basis of Sex",
    "year" : 1996   
},

{
    "_id" : ObjectId("63a994974ac549c5ea982d28"),
    "title" : "Holmes and Watson",
    "year" : 1940
},
{
    "_id" : ObjectId("63a994974ac549c5ea982d27"),
    "title" : "Conundrum: Secrets Among Friends",
    "year" : 1957
},
{
    "_id" : ObjectId("63a994974ac549c5ea982d26"),
    "title" : "Welcome to Marwen",
    "year" : 2000
},

{
    "_id" : ObjectId("63a994974ac549c5ea982d25"),
    "title" : "Mary Poppins Returns",
    "year" : 1997
},

{
    "_id" : ObjectId("63a994974ac549c5ea982d24"),
    "title" : "Bumblebee",
    "year" : 2004
},

I am trying to get all title that they have a leap year and I want to get the "count" of all title.

So, I tried this code:

var q1 = {$project: {
    leap: {
        "$and": [
                "$eq": ["$divide"["$year", 4], 0],
                {
                    "$or":[{"$ne": ["$divide"["$year",100],0]},
                    {"$eq": ["$divide"["$year", 400],0]}]
                }
            ]
    }
}}

var q2 = {$group: {"_id": null, "total": {$sum:1}}}

var etapas = [q1,q2]


db.genres.aggregate(etapas)

But, with this code, I only get in 'q1', the variable 'leap', all false conditionals. So, I do not know how to get the year when the logical operator is true or false. Even more, I want to count all the leap years of the documents I have been given before.

The expect output for the documents before is this:

{
    "_id": leap year
    "count": 3
}

How can I do that? How can I type when I've got a false result?

Thanks so much for your attention in this problem. Whatever ask you need, do it without any problem.

CodePudding user response:

To check if a number is divisible by another, you need to see if the remainder is 0 using $mod, such as:

db.collection.aggregate([
  {$project: {
      leap: {
        "$and": [
          {"$eq": [{"$mod": ["$year",4]}, 0]},
          {"$or": [
              {"$ne": [{"$mod": ["$year", 100]}, 0]},
              {"$eq": [{"$mod": ["$year", 400]}, 0] }
          ]}
        ]
      }
  }},
  {$group: {
      "_id": "$leap",
      "total": {$sum: 1}
  }}
])

Playground

  • Related