mongodb mapReduce中范围和查询有什么区别?

时间:2017-02-13 18:03:48

标签: mongodb

根据我从mapReduce documentation获得的内容,可以使用类似的方式使用查询和范围参数来过滤输入数据。

是吗?如果是这样,是否存在性能差异?

1 个答案:

答案 0 :(得分:0)

map参数“指定可在地图中访问的全局变量,减少和完成函数”(source)。这意味着您可以传递可以在reducefinalizescope的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>