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')
进行第二层过滤,这样能保证只提取满足所有条件的数据。
- 逻辑组合:如果存在更多条件,例如除了
status
和 doc_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
});
}