面试题答案
一键面试- 视图设计:
- 在
orders
集合中,设计一个视图,假设名为by_customer_id_amount
。- map 函数:
- 在
function (doc) {
if (doc.order_id && doc.customer_id && doc.amount) {
emit([doc.customer_id, doc.amount], doc);
}
}
- 在
customers
集合中,设计一个视图,假设名为by_status
。- map 函数:
function (doc) {
if (doc.status === 'active' && doc.customer_id) {
emit(doc.customer_id, doc);
}
}
- 请求结构:
- 首先,通过
customers
集合的by_status
视图获取所有状态为active
的客户的customer_id
。- 请求 URL:
http://{couchdb_server_url}/{customers_db}/_design/{design_doc_name}/_view/by_status
- 请求方法:
GET
- 响应示例:
- 请求 URL:
- 首先,通过
{
"total_rows": 2,
"offset": 0,
"rows": [
{
"id": "customer_1",
"key": "customer_1",
"value": {
"customer_id": "customer_1",
"customer_name": "John Doe",
"status": "active"
}
},
{
"id": "customer_2",
"key": "customer_2",
"value": {
"customer_id": "customer_2",
"customer_name": "Jane Smith",
"status": "active"
}
}
]
}
- 然后,根据获取到的
customer_id
,使用orders
集合的by_customer_id_amount
视图,查询订单金额大于1000的订单。- 请求 URL:
http://{couchdb_server_url}/{orders_db}/_design/{design_doc_name}/_view/by_customer_id_amount?startkey=["customer_1",1000]&endkey=["customer_1",{}]
- 这里假设获取到的一个
customer_id
是customer_1
,对于多个customer_id
,需要多次请求,每次替换startkey
和endkey
中的customer_id
部分。
- 请求方法:
GET
- 响应示例:
- 请求 URL:
{
"total_rows": 1,
"offset": 0,
"rows": [
{
"id": "order_1",
"key": ["customer_1", 1500],
"value": {
"order_id": "order_1",
"customer_id": "customer_1",
"amount": 1500
}
}
]
}
通过上述步骤,就可以实现查询出所有状态为 active
的客户所下的订单,并且订单金额大于1000。在实际应用中,可能需要编写代码来自动化处理多个 customer_id
的请求和结果合并。