w3resource

MongoDB Exercise - Look for restaurants with a grade of 2 or 6 that are located in Manhattan or Brooklyn, and whose cuisine isn't American or Chinese


Write a MongoDB query to find the restaurants that have a grade with a score of 2 or a grade with a score of 6 and are located in the borough of Manhattan or Brooklyn, and their cuisine is not American or Chinese.

Structure of 'restaurants' collection :

{
  "address": {
     "building": "1007",
     "coord": [ -73.856077, 40.848447 ],
     "street": "Morris Park Ave",
     "zipcode": "10462"
  },
  "borough": "Bronx",
  "cuisine": "Bakery",
  "grades": [
     { "date": { "$date": 1393804800000 }, "grade": "A", "score": 2 },
     { "date": { "$date": 1378857600000 }, "grade": "A", "score": 6 },
     { "date": { "$date": 1358985600000 }, "grade": "A", "score": 10 },
     { "date": { "$date": 1322006400000 }, "grade": "A", "score": 9 },
     { "date": { "$date": 1299715200000 }, "grade": "B", "score": 14 }
  ],
  "name": "Morris Park Bake Shop",
  "restaurant_id": "30075445"
}

Query:

db.restaurants.find({
  $and: [
    {
      $or: [
{ "grades.score": 2 },
{ "grades.score": 6 }
      ]
    },
    {
      $or: [
{ borough: "Manhattan" },
{ borough: "Brooklyn" }
      ]
    },
    {
      $nor: [
{ cuisine: "American" },
{ cuisine: "Chinese" }
      ]
    }
  ]
})

Output:

{ "_id" : ObjectId("6422c0161238e3bec47ca601"), "address" : { "building" : "351", "coord" : [ -73.98513559999999, 40.7676919 ], "street" : "West   57 Street", "zipcode" : "10019" }, "borough" : "Manhattan", "cuisine" : "Irish", "grades" : [ { "date" : { "$date" : 1409961600000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1374451200000 }, "grade" : "A", "score" : 11 }, { "date" : { "$date" : 1343692800000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1325116800000 }, "grade" : "A", "score" : 12 } ], "name" : "Dj Reynolds Pub And Restaurant", "restaurant_id" : "30191841" }
{ "_id" : ObjectId("6422c0181238e3bec47ca607"), "address" : { "building" : "6409", "coord" : [ -74.00528899999999, 40.628886 ], "street" : "11 Avenue", "zipcode" : "11219" }, "borough" : "Brooklyn", "cuisine" : "American ", "grades" : [ { "date" : { "$date" : 1405641600000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1375142400000 }, "grade" : "A", "score" : 12 }, { "date" : { "$date" : 1360713600000 }, "grade" : "A", "score" : 11 }, { "date" : { "$date" : 1345075200000 }, "grade" : "A", "score" : 2 }, { "date" : { "$date" : 1313539200000 }, "grade" : "A", "score" : 11 } ], "name" : "Regina Caterers", "restaurant_id" : "40356649" }

.....

Explanation:

The said query in MongoDB that finds documents in the restaurants collection that have a grade with a score of 2 OR 6, are located in the borough of Manhattan or Brooklyn, and have a cuisine that is not American or Chinese.

The $and operator is used to combine multiple conditions with an AND logical operator.

The $or operator is used as an OR logical operator to find restaurants that have a grade with a score of 2 OR a grade with a score of 6 and the another $or operator checks for the borough is "Manhattan" or "Brooklyn".

The $nor operator is used as a NOR logical operator to find restaurants whose cuisine is NOT American AND NOT Chinese.

Note: This output is generated using MongoDB server version 3.6

Improve this sample solution and post your code through Disqus.

Previous: Find restaurants that are located in Manhattan or Brooklyn and serve non-American cuisine and have a grade of 2 or 6.
Next: All restaurants with a score of 5 or higher.

What is the difficulty level of this exercise?



Follow us on Facebook and Twitter for latest update.