MST

星途 面试题库

面试题:CouchDB Map函数在动态数据结构及多条件下的数据提取范围界定

在CouchDB中,文档结构可能会随着业务发展而动态变化。同时,业务需求是提取满足以下条件的数据:文档中存在一个名为 'status' 的字段,其值为 'active',并且根据文档类型不同(文档类型通过 'doc_type' 字段标识),提取不同的关键信息,例如 'doc_type' 为 'product' 时提取 'product_name' 和 'price' 字段,'doc_type' 为 'customer' 时提取 'customer_name' 和 'contact_number' 字段。请设计一个通用的Map函数来实现此功能,并详细阐述如何应对动态数据结构以及多条件下准确界定数据提取范围的策略。
43.2万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试

1. Map函数设计

function (doc) {
    if (doc.status === 'active') {
        if (doc.doc_type === 'product') {
            emit(doc._id, {
                doc_type: 'product',
                product_name: doc.product_name,
                price: doc.price
            });
        } else if (doc.doc_type === 'customer') {
            emit(doc._id, {
                doc_type: 'customer',
                customer_name: doc.customer_name,
                contact_number: doc.contact_number
            });
        }
    }
}

2. 应对动态数据结构的策略

  • 字段存在性检查:在处理数据提取之前,通过 if (doc.fieldName) 这种方式检查所需字段是否存在于文档中,例如 if (doc.status) { /* 进行后续处理 */ }。对于动态变化结构,有些字段可能不存在,这种检查能防止代码运行时错误。
  • 默认值设置:对于可能缺失的关键信息字段,在Map函数中可以设置默认值。比如,如果 product_name 可能不存在于 product 类型文档中,可以这样处理:
if (doc.doc_type === 'product') {
   var product_name = doc.product_name || 'N/A';
   // 继续后续处理
}

3. 多条件下准确界定数据提取范围的策略

  • 分层条件判断:如上述Map函数,先通过 if (doc.status === 'active') 判断 status 字段的值,这是第一层过滤。然后在这个条件满足的基础上,再通过 if (doc.doc_type === 'product')if (doc.doc_type === 'customer') 进行第二层过滤,这样能保证只提取满足所有条件的数据。
  • 逻辑组合:如果存在更多条件,例如除了 statusdoc_type 条件外,还需要根据其他字段值进行判断,可以通过逻辑运算符(&&||)进行组合。例如,如果 product 类型文档还需要 price 大于某个值才提取:
if (doc.status === 'active' && doc.doc_type === 'product' && doc.price > 10) {
   emit(doc._id, {
       doc_type: 'product',
       product_name: doc.product_name,
       price: doc.price
   });
}