w3resource

MongoDB Exercise - Find restaurants that are located in Manhattan or Brooklyn and serve non-American cuisine and have a grade of 2 or 6


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.

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: [
{ borough: "Manhattan" },
{ borough: "Brooklyn" }
      ]
    },
    {
      $or: [
{ "grades.score": 2 },
{ "grades.score": 6 }
      ]
    },
    {
cuisine: { $ne: "American" }
    }
  ]
})

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 returns all the restaurants that have a grade with a score of 2 or 6, are located in the borough of Manhattan or Brooklyn, and their cuisine is not American.

The uses of $and operator specify that all conditions 1) the restaurant must be located in Manhattan or Brooklyn, 2) must have a grade with a score of 2 or 6, and 3) must not have the cuisine of "American" must be match.

The $or operator checks for the borough is "Manhattan" or "Brooklyn", the another $or operator, which checks whether the "grades" array contains a document with a score of 2 or 6.

The $ne operator checks whether the value of the "cuisine" field is not equal to "American".

Note: This output is generated using MongoDB server version 3.6

Improve this sample solution and post your code through Disqus.

Previous: Find restaurants in Manhattanor Brooklynthat have a grade of 2 or 6.
Next: 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.

What is the difficulty level of this exercise?



Follow us on Facebook and Twitter for latest update.