根据我从mapReduce documentation获得的内容,可以使用类似的方式使用查询和范围参数来过滤输入数据。
是吗?如果是这样,是否存在性能差异?
答案 0 :(得分:0)
map
参数“指定可在地图中访问的全局变量,减少和完成函数”(source)。这意味着您可以传递可以在reduce
,finalize
和scope
的JavaScript代码中使用的变量。因此,query
不会过滤任何内容。
然而,db.collection.find()
参数会过滤集合中与scope
类似的文档,然后mapReduce仅应用于这些集合条目。
db.orders.insert({
_id: ObjectId("50a8240b927d5d8b5891743c"),
cust_id: "abc123",
ord_date: new Date("Oct 04, 2012"),
status: 'A',
price: 25,
items: [ { sku: "mmm", qty: 5, price: 2.5 },
{ sku: "nnn", qty: 5, price: 2.5 } ]
})
这是mapReduce documentation中示例的修改版本。
考虑使用以下命令创建的集合:
factor
让我们从页面修改map函数以添加变量var mapFunction = function() {
emit(this.cust_id, factor * this.price);
};
:
factor
我们稍后会将值mapReduce
传递给var reduceFunction = function(keyCustId, valuesPrices) {
return Array.sum(valuesPrices);
};
。
我们保留文档中的reduce函数:
factor
现在我们可以在mapReduce调用中动态设置db.orders.mapReduce(
mapFunction,
reduceFunction,
{
out: {
inline: 1,
},
scope: {
factor: 3
}
}
)
的值,而无需修改我们的函数:
{
"results" : [
{
"_id" : "abc123",
"value" : 75
}
],
"timeMillis" : 35,
"counts" : {
"input" : 1,
"emit" : 1,
"reduce" : 0,
"output" : 1
},
"ok" : 1
}
我们得到的结果是:
<?xml version="1.0" encoding="utf-8" ?>
<nlog xmlns="http://www.nlog-project.org/schemas/NLog.xsd"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.nlog-project.org/schemas/NLog.xsd NLog.xsd"
autoReload="true"
throwExceptions="false"
internalLogLevel="Off" internalLogFile="c:\temp\nlog-internal.log">
<targets>
<target name="logfile" xsi:type="File" fileName="file.txt" />
</targets>
<rules>
<logger name="*" minlevel="Trace" writeTo="logfile" />
</rules>
</nlog>