MongoDB mapReduceOptions类型疑问:out字段可选性与类型定义
关于MongoDB mapReduceOptions类型的两个疑问解答
我正在研究MongoDB已废弃的mapReduce函数对应的TypeScript类型定义MapReduceOptions:
export interface MapReduceOptions<TKey = ObjectId, TValue = Document> extends CommandOperationOptions { /** Sets the output target for the map reduce job. */ out?: 'inline' | { inline: 1 } | { replace: string } | { merge: string } | { reduce: string }; /** Query filter object. */ query?: Document; /** Sorts the input objects using this key. Useful for optimization, like sorting by the emit key for fewer reduces. */ sort?: Sort; /** Number of objects to return from collection. */ limit?: number; /** Keep temporary data. */ keeptemp?: boolean; /** Finalize function. */ finalize?: FinalizeFunction<TKey, TValue> | string; /** Can pass in variables that can be access from map/reduce/finalize. */ scope?: Document; /** It is possible to make the execution stay in JS. Provided in MongoDB > 2.0.X. */ jsMode?: boolean; /** Provide statistics on job execution time. */ verbose?: boolean; /** Allow driver to bypass schema validation in MongoDB 3.2 or higher. */ bypassDocumentValidation?: boolean; }
结合实际使用,我有两个疑问:
1. 为何out被定义为可选字段?不指定该字段时会发生什么?
从MongoDB的官方行为来看,mapReduce命令本质上要求必须指定输出目标——所有官方示例也都明确传入了out参数。TypeScript类型中将其标记为可选,大概率是历史遗留问题:
- 早期MongoDB版本或旧驱动可能允许省略
out,默认采用inline模式直接返回结果; - 驱动的类型定义没有及时跟进后续版本的行为变更,或者为了兼容旧代码保留了可选标记。
但在实际使用中,现在的驱动版本如果不指定out,很可能会抛出参数缺失的错误。另外由于mapReduce已被官方废弃,维护团队也不会再更新类型定义来修正这个不一致。
2. 实际使用中存在直接传入字符串的写法(如out: 'Name_Total'),为何类型定义中未包含普通字符串类型?
这种直接传字符串的写法是MongoDB提供的简化语法,它等价于{ replace: 'Name_Total' }——即MongoDB会自动将字符串解析为「替换指定名称的集合」的输出模式。
TypeScript类型定义没有覆盖这种场景,原因有两点:
- 类型定义更严格地遵循了
mapReduce命令的结构化参数规范,没有兼容这种shell/旧驱动的简化写法; - 由于
mapReduce已被废弃,维护团队不会再补充这类边缘场景的类型支持。
如果需要在TypeScript中使用这种简化写法,可以通过类型断言绕过检查:
mapReduce( function(){ emit(this.Name,1)}, function(key, values) {return Array.sum(values)}, {query:{Marks:{$gt:70}}, out: 'Name_Total' as 'inline'} )
或者直接使用结构化写法{ replace: 'Name_Total' }来符合类型定义。
内容的提问来源于stack exchange,提问作者Alwaysblue
相关产品推荐
相关产品推荐

