面试题答案
一键面试1. MongoDB文档结构设计
{
"_id": ObjectId("订单唯一标识"),
"orderDetails": [
{
"productName": "商品名称1",
"quantity": 2,
"price": 100.00
},
{
"productName": "商品名称2",
"quantity": 1,
"price": 200.00
}
],
"userInfo": {
"userId": "用户唯一标识",
"userName": "用户名",
"userAddress": "用户地址"
},
"orderStatus": "订单状态,如已支付、未支付等",
"orderDate": ISODate("订单生成日期")
}
2. 订单添加操作
- 数据一致性:使用MongoDB的单文档原子性操作,在插入订单文档时,整个文档的插入是原子的,要么全部成功,要么全部失败,保证订单数据的一致性。
- 查询效率:为常用查询字段,如
userInfo.userId
、orderStatus
、orderDate
等添加索引。在插入订单时,这些索引会被自动维护,虽然会稍微增加插入时间,但极大提高后续查询效率。
from pymongo import MongoClient
client = MongoClient('mongodb://localhost:27017/')
db = client['ecommerce']
orders = db['orders']
new_order = {
"orderDetails": [
{
"productName": "商品名称1",
"quantity": 2,
"price": 100.00
}
],
"userInfo": {
"userId": "123456",
"userName": "张三",
"userAddress": "XX省XX市"
},
"orderStatus": "未支付",
"orderDate": "2023-10-01"
}
result = orders.insert_one(new_order)
print(result.inserted_id)
3. 订单修改操作
- 数据一致性:同样利用单文档原子性操作,在更新订单时,只要更新操作在单个文档内,就可以保证数据一致性。如果涉及多个文档(如订单状态更新同时影响库存),在MongoDB 4.0+版本中可以使用多文档事务来保证一致性。
- 查询效率:更新操作尽量避免对索引字段值的修改,如果必须修改,提前考虑好索引的重建或更新策略。对于内嵌文档的修改,如修改商品数量,可以使用
$set
操作符精准更新。
filter_query = {"_id": ObjectId("订单唯一标识")}
update_query = {
"$set": {
"orderStatus": "已支付",
"orderDetails.0.quantity": 3
}
}
result = orders.update_one(filter_query, update_query)
print(result.modified_count)
4. 订单查询操作
- 数据一致性:MongoDB的读操作本身保证一致性,默认读操作会返回最新提交的数据。
- 查询效率:利用前面添加的索引进行快速查询。例如,查询某个用户的所有订单:
filter_query = {"userInfo.userId": "123456"}
orders = orders.find(filter_query)
for order in orders:
print(order)
通过上述设计和操作,可以在保证数据一致性的前提下,高效地处理电商系统中订单的添加、修改和查询操作。