MST

星途 面试题库

面试题:CouchDB复杂条件查询之关联文档与条件嵌套查询

假设有两个CouchDB文档集合,一个是 'orders' 集合,文档包含 'order_id'、'customer_id' 等字段;另一个是 'customers' 集合,文档包含 'customer_id'、'customer_name'、'status' 等字段。现在要查询出所有状态为 'active' 的客户所下的订单,并且订单金额大于1000。请详细说明如何通过CouchDB HTTP API实现这种涉及关联文档及嵌套条件的复杂查询,包括可能需要用到的视图设计、请求结构等。
42.8万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试
  1. 视图设计
    • 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);
    }
}
  1. 请求结构
    • 首先,通过 customers 集合的 by_status 视图获取所有状态为 active 的客户的 customer_id
      • 请求 URL
        • http://{couchdb_server_url}/{customers_db}/_design/{design_doc_name}/_view/by_status
      • 请求方法GET
      • 响应示例
{
    "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_idcustomer_1,对于多个 customer_id,需要多次请求,每次替换 startkeyendkey 中的 customer_id 部分。
    • 请求方法GET
    • 响应示例
{
    "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 的请求和结果合并。