MongoDB クエリを作成して、各区で「A」評価の数が最も多い上位 5 つのレストランを検索します。
「レストラン」コレクションの構造:
{
"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.aggregate([
{$unwind: "$grades"},
{$match: {"grades.grade": "A"}},
{$group: {
_id: {borough: "$borough", restaurant_id: "$restaurant_id"},
gradeCount: {$sum: 1}
}},
{$sort: {
"_id.borough": 1,
gradeCount: -1
}},
{$group: {
_id: "$_id.borough",
topRestaurants: {$push: {restaurant_id: "$_id.restaurant_id", gradeCount: "$gradeCount"}}
}},
{$project: {
_id: 0,
borough: "$_id",
topRestaurants: {$slice: ["$topRestaurants", 5]}
}}
])
Output
{
borough: 'Bronx',
topRestaurants: [
{ restaurant_id: '40863575', gradeCount: 7 },
{ restaurant_id: '40369087', gradeCount: 7 },
{ restaurant_id: '40399778', gradeCount: 7 },
{ restaurant_id: '40738028', gradeCount: 6 },
{ restaurant_id: '40607093', gradeCount: 6 }
]
},
{
borough: 'Manhattan',
topRestaurants: [
{ restaurant_id: '40752011', gradeCount: 7 },
{ restaurant_id: '40798457', gradeCount: 7 },
{ restaurant_id: '40873102', gradeCount: 7 },
{ restaurant_id: '40401093', gradeCount: 7 },
{ restaurant_id: '40735660', gradeCount: 7 }
]
},
{
borough: 'Queens',
topRestaurants: [
{ restaurant_id: '40362432', gradeCount: 7 },
{ restaurant_id: '40816235', gradeCount: 7 },
{ restaurant_id: '40787054', gradeCount: 7 },
{ restaurant_id: '40393093', gradeCount: 7 },
{ restaurant_id: '40786301', gradeCount: 7 }
]
},
.....
説明
このMongoDBの集約パイプラインは、’restaurants’ コレクション内のドキュメントを特定の手順に従って変換および絞り込むものです。具体的な手順は次の通りです:
$unwind: “$grades”:このステップでは、“grades” 配列内の各要素を展開して、各評価の情報を個別のドキュメントとして取り出します。
$match: {“grades.grade”: “A”}:このステップでは、評価が “A” の評価のみを持つドキュメントを絞り込みます。
$group: {_id: {borough: “$borough”, restaurant_id: “$restaurant_id”}, gradeCount: {$sum: 1}}:このステップでは、“borough” と “restaurant_id” の組み合わせごとに “A” 評価の数を計算します。
$sort: {“_id.borough”: 1, gradeCount: -1}:このステップでは、“borough” ごとに “A” 評価の数を降順でソートし、同じ地区内で評価数が多いレストランが最初にくるようにします。
$group: {_id: “$_id.borough”, topRestaurants: {$push: {restaurant_id: “$_id.restaurant_id”, gradeCount: “$gradeCount”}}}:このステップでは、地区ごとに評価数が多いレストランの情報を配列としてまとめます。
$project: {_id: 0, borough: “$_id”, topRestaurants: {$slice: [“$topRestaurants”, 5]}}:最後のステップでは、出力ドキュメントの形式を整えます。“borough” フィールドは “_id” からコピーされ、”topRestaurants” フィールドは最大5つのレストラン情報を含む配列として出力されます。
この集約パイプラインの結果として、各地区ごとに評価が “A” のレストランの中で評価数が多い上位5つのレストランが抽出され、地区ごとのトップレストランの情報が取得され、出力されます。
Previous:各料理タイプのトップ 5 レストランとその平均スコアを見つけます
コメント