-
Notifications
You must be signed in to change notification settings - Fork 240
/
aggregation.js
78 lines (68 loc) · 2.68 KB
/
aggregation.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
const { MongoClient } = require('mongodb');
async function main() {
/**
* Connection URI. Update <username>, <password>, and <your-cluster-url> to reflect your cluster.
* See https://docs.mongodb.com/drivers/node/ for more details
*/
const uri = "mongodb+srv://<username>:<password>@<your-cluster-url>/sample_airbnb?retryWrites=true&w=majority";
/**
* The Mongo Client you will use to interact with your database
* See https://mongodb.github.io/node-mongodb-native/3.6/api/MongoClient.html for more details
* In case: '[MONGODB DRIVER] Warning: Current Server Discovery and Monitoring engine is deprecated...'
* pass option { useUnifiedTopology: true } to the MongoClient constructor.
* const client = new MongoClient(uri, {useUnifiedTopology: true})
*/
const client = new MongoClient(uri);
try {
// Connect to the MongoDB cluster
await client.connect();
// Make the appropriate DB calls
// Print the 10 cheapest suburbs in the Sydney, Australia market
await printCheapestSuburbs(client, "Australia", "Sydney", 10);
} finally {
// Close the connection to the MongoDB cluster
await client.close();
}
}
main().catch(console.error);
/**
* Print the cheapest suburbs for a given market
* @param {MongoClient} client A MongoClient that is connected to a cluster with the sample_airbnb database
* @param {String} country The country for the given market
* @param {String} market The market you want to search
* @param {number} maxNumberToPrint The maximum number of suburbs to print
*/
async function printCheapestSuburbs(client, country, market, maxNumberToPrint) {
const pipeline = [
{
'$match': {
'bedrooms': 1,
'address.country': country,
'address.market': market,
'address.suburb': {
'$exists': 1,
'$ne': ''
},
'room_type': 'Entire home/apt'
}
}, {
'$group': {
'_id': '$address.suburb',
'averagePrice': {
'$avg': '$price'
}
}
}, {
'$sort': {
'averagePrice': 1
}
}, {
'$limit': maxNumberToPrint
}
];
// See https://mongodb.github.io/node-mongodb-native/3.6/api/Collection.html#aggregate for the aggregate() docs
const aggCursor = client.db("sample_airbnb").collection("listingsAndReviews").aggregate(pipeline);
await aggCursor.forEach(airbnbListing => {
console.log(`${airbnbListing._id}: ${airbnbListing.averagePrice}`);
});
}