面试题答案
一键面试- 创建索引
- 原理:索引就像书籍的目录,能让MongoDB快速定位到所需数据。例如在查询频繁的字段上创建索引,如在存储用户信息的集合中,若常根据
username
字段查询用户,就对username
字段创建索引,MongoDB可通过索引快速找到对应的文档,而无需全集合扫描,大大提升查询速度。示例代码:
from pymongo import MongoClient client = MongoClient() db = client['test_db'] collection = db['test_collection'] collection.create_index('username')
- 原理:索引就像书籍的目录,能让MongoDB快速定位到所需数据。例如在查询频繁的字段上创建索引,如在存储用户信息的集合中,若常根据
- 投影
- 原理:只返回查询所需的字段,减少数据传输量和处理时间。比如查询用户信息时,若只需要
name
和age
字段,而集合中还有其他大量字段,使用投影可避免MongoDB检索和返回不必要的字段。示例代码:
这里result = collection.find({}, {'name': 1, 'age': 1, '_id': 0})
{'name': 1, 'age': 1, '_id': 0}
表示只返回name
和age
字段,不返回_id
字段。 - 原理:只返回查询所需的字段,减少数据传输量和处理时间。比如查询用户信息时,若只需要
- 批量读取
- 原理:减少与数据库的交互次数。如果需要获取多条数据,一次请求获取多条数据比多次单个请求效率更高。例如使用
find
方法查询多条数据时,MongoDB会按批次返回数据,Python端可使用迭代器逐步处理这些数据,减少网络开销。示例代码:
cursor = collection.find() for doc in cursor: print(doc)
- 原理:减少与数据库的交互次数。如果需要获取多条数据,一次请求获取多条数据比多次单个请求效率更高。例如使用
- 避免全集合扫描
- 原理:尽量使用限定条件精确查询。若查询时没有合适的索引且没有限定条件,MongoDB就需要扫描全集合来获取数据,这非常耗时。比如查询年龄大于30岁的用户,使用
{'age': {'$gt': 30}}
这样的查询条件,结合合适的索引,可避免全集合扫描。示例代码:
result = collection.find({'age': {'$gt': 30}})
- 原理:尽量使用限定条件精确查询。若查询时没有合适的索引且没有限定条件,MongoDB就需要扫描全集合来获取数据,这非常耗时。比如查询年龄大于30岁的用户,使用
- 使用聚合管道优化复杂查询
- 原理:对于复杂查询,聚合管道可以在数据库端对数据进行处理,减少数据传输量。例如在统计每个年龄段的用户数量时,使用聚合管道可在MongoDB服务器端完成分组和计数操作,再将结果返回给Python应用。示例代码:
pipeline = [ {'$group': {'_id': '$age', 'count': {'$sum': 1}}} ] result = collection.aggregate(pipeline)