如何创建GET API端点按名称查询MongoDB中的商家文档?
问题描述
我在MongoDB中存储了商家数据,结构如下:
[ { "_id": "1", "name": "Apple", "reviews": [ { "_id": "1", "comment": "Good", } ] }, { "_id": "2", "name": "Microsoft", "reviews": [ { "_id": "1", "comment": "Great", } ] } ]
现有一个通过商家_id获取信息的GET API,代码如下:
@app.route("/api/v1.0/businesses/<string:id>", methods=["GET"]) def show_one_business(id): business = businesses.find_one({'_id':ObjectId(id)}) if business is not None: business['_id'] = str(business['_id']) for review in business['reviews']: review['_id'] = str(review['_id']) return make_response( jsonify ( [ business ] ), 200 ) else: return make_response( jsonify( {"error" : "Invalid business ID"} ), 404 )
我想创建一个通过商家名称(如Apple)获取对应信息的API端点,尝试将原接口中的_id改为name但未成功,该如何实现?
解决方案
直接修改原接口会导致路由冲突,且name是字符串类型无需转ObjectId,正确的做法是新增独立路由:
- 定义新路由:设置和原接口不同的路径,比如
/api/v1.0/businesses/name/<string:name>,避免路径匹配冲突。 - 调整查询逻辑:查询条件直接用
name字段匹配字符串,不需要使用ObjectId转换。 - 复用数据处理逻辑:和原接口一致,将MongoDB返回的
ObjectId类型转为字符串,确保JSON序列化正常。 - 错误处理:未找到商家时返回404错误,提示信息对应修改为“Invalid business name”。
完整代码示例:
@app.route("/api/v1.0/businesses/name/<string:name>", methods=["GET"]) def show_business_by_name(name): # 直接用name字符串匹配,无需ObjectId转换 business = businesses.find_one({'name': name}) if business is not None: business['_id'] = str(business['_id']) for review in business['reviews']: review['_id'] = str(review['_id']) return make_response(jsonify([business]), 200) else: return make_response(jsonify({"error": "Invalid business name"}), 404)
补充说明
- 如果需要不区分大小写的名称匹配,可以使用MongoDB正则表达式查询:
business = businesses.find_one({'name': {'$regex': f'^{name}$', '$options': 'i'}}) - 若存在多个同名商家,
find_one只会返回第一个匹配结果,如需返回全部同名商家,改用find()并转为列表处理。
内容的提问来源于stack exchange,提问作者gadget-man615
相关产品推荐
相关产品推荐

