面试题答案
一键面试- 创建索引:
- 文本索引:
db.shops.createIndex({description: "text"})
- 地理空间索引:
db.shops.createIndex({"address.location": "2dsphere"})
- 文本索引:
- 编写聚合管道:
db.shops.aggregate([ { $match: { "address.city": "New York", $text: { $search: "organic" }, "reviews.rating": { $exists: true } } }, { $unwind: "$reviews" }, { $group: { _id: "$_id", name: { $first: "$name" }, address: { $first: "$address" }, description: { $first: "$description" }, averageRating: { $avg: "$reviews.rating" } } }, { $match: { averageRating: { $gt: 4 }, "address.location": { $near: { $geometry: { type: "Point", coordinates: [-73.98, 40.75] }, $maxDistance: 10000 } } } } ]);
解释:
- 首先创建文本索引和地理空间索引,以提高查询效率。
- 第一个
$match
阶段筛选出城市为New York
且描述中包含organic
的店铺,同时确保reviews.rating
字段存在。 $unwind
阶段将reviews
数组展开,以便后续计算平均评分。$group
阶段重新组合文档,并计算平均评分。- 最后一个
$match
阶段筛选出平均评分大于4且距离给定坐标点在10公里范围内的店铺。