面试题答案
一键面试单字段索引
- 适用场景:当更新操作主要基于单个字段进行筛选时适用。例如,一个用户信息集合,经常根据用户ID更新用户的地址信息。假设集合名为
users
,文档结构如下:
{
"_id": ObjectId("64a1c91e19c2c0369c1c1234"),
"user_id": 12345,
"name": "John Doe",
"address": "123 Main St"
}
如果频繁执行根据user_id
更新address
的操作,可以在user_id
字段上创建单字段索引:
db.users.createIndex( { user_id: 1 } );
这样在更新时,MongoDB能快速定位到需要更新的文档,提升更新性能。
复合索引
- 适用场景:当更新操作需要基于多个字段的组合条件筛选时适用。比如在一个订单集合中,经常根据
customer_id
和order_date
来更新订单状态。假设集合名为orders
,文档结构如下:
{
"_id": ObjectId("64a1c91e19c2c0369c1c5678"),
"customer_id": 56789,
"order_date": ISODate("2023-10-01T00:00:00Z"),
"order_status": "pending"
}
可以创建复合索引:
db.orders.createIndex( { customer_id: 1, order_date: 1 } );
这样在更新符合customer_id
和order_date
条件的订单状态时,能借助复合索引快速定位文档,提高更新效率。
部分索引
- 适用场景:当更新操作只涉及集合中满足特定条件的部分文档时适用。例如,在一个日志集合中,只对错误级别为“严重”的日志文档进行更新,添加处理结果字段。假设集合名为
logs
,文档结构如下:
{
"_id": ObjectId("64a1c91e19c2c0369c1c9012"),
"log_level": "critical",
"log_message": "System failure",
"processed_result": null
}
可以创建部分索引:
db.logs.createIndex( { log_level: 1 }, { partialFilterExpression: { log_level: "critical" } } );
这种索引只包含满足log_level
为“critical”的文档,相比全集合索引,占用空间小,更新操作针对这部分文档时性能更好。