MST

星途 面试题库

面试题:CouchDB Map函数在复杂嵌套结构下的数据提取范围界定

给定一个CouchDB数据库,其中文档具有如下复杂嵌套结构:{"main_data": {"sub_section1": {"data1": "value1", "data2": "value2"}, "sub_section2": [ {"sub_sub_data1": "sub_value1"}, {"sub_sub_data2": "sub_value2"} ]}}。要求编写Map函数,提取sub_section1中的data1字段以及sub_section2数组中每个对象的第一个键值对。请详细说明如何通过Map函数准确界定这样复杂结构下的数据提取范围。
21.7万 热度难度
数据库CouchDB

知识考点

AI 面试

面试题答案

一键面试
function (doc) {
    if (doc.main_data && doc.main_data.sub_section1) {
        emit(null, doc.main_data.sub_section1.data1);
    }
    if (doc.main_data && doc.main_data.sub_section2) {
        doc.main_data.sub_section2.forEach(function(subSubDoc) {
            var key = Object.keys(subSubDoc)[0];
            var value = subSubDoc[key];
            emit(null, {[key]: value});
        });
    }
}

说明

  1. if (doc.main_data && doc.main_data.sub_section1)
    • 先判断doc对象中存在main_data属性,并且main_data属性中存在sub_section1属性。这一步是为了界定数据提取范围,保证在访问sub_section1data1字段时不会因为sub_section1不存在而报错。
  2. emit(null, doc.main_data.sub_section1.data1);
    • 如果上述条件满足,就将sub_section1中的data1字段的值通过emit函数输出。null作为键,这里键的选择可以根据后续Reduce函数的需求进行调整,如果没有Reduce操作,使用null是一种简单的标识方式。
  3. if (doc.main_data && doc.main_data.sub_section2)
    • 同样先判断doc对象中存在main_data属性,并且main_data属性中存在sub_section2属性。这一步也是为了界定数据提取范围,确保后续对sub_section2数组的操作是安全的。
  4. doc.main_data.sub_section2.forEach(...)
    • sub_section2数组中的每个对象进行遍历。
  5. var key = Object.keys(subSubDoc)[0];
    • 获取当前遍历到的对象的第一个键。
  6. var value = subSubDoc[key];
    • 根据获取到的键,获取对应的值。
  7. emit(null, {[key]: value});
    • 将键值对通过emit函数输出,同样以null作为键。这样就准确提取了sub_section2数组中每个对象的第一个键值对。