3

Mongodb mapreduce 函数不提供任何方法来从数据库中跳过记录,如 find 函数。它具有查询、排序和限制选项的功能。但是我想从数据库中跳过一些记录,但我没有任何办法。请提供解决方案。

提前致谢。

4

2 回答 2

12

理想情况下,结构良好的 map-reduce 查询将允许您跳过集合中的特定文档。

或者,正如 Sergio 指出的那样,您可以简单地不在 map() 中发出特定文档。使用范围来定义全局计数器变量是将发出限制到指定范围的文档的一种方法。例如,跳过按 ObjectID 排序的前 20 个文档(因此按插入时间排序):

db.collection_name.mapReduce(map, reduce, {out: example_output, sort: {id:-1}, scope: "var counter=0")}; 

地图功能:

function(){
    counter ++;
    if (counter > 20){
        emit(key, value);
    }
}
于 2012-05-09T17:51:35.313 回答
0

我不确定这个功能从哪个版本开始可用,但肯定在 MongoDB 2.6 中,该mapReduce()函数提供了query参数

query:文件

选修的。使用查询运算符指定选择标准,以确定输入到 map 函数的文档。

例子

考虑对包含以下原型文档的集合订单的以下 map-reduce 操作:

{
     _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 } ]
}

使用 mapFunction2、reduceFunction2 和 finalizeFunction2 函数对订单集合执行 map-reduce 操作。

db.orders.mapReduce( mapFunction2,
                 reduceFunction2,
                 {
                   out: { merge: "map_reduce_example" },
                   query: { ord_date:
                              { $gt: new Date('01/01/2012') }
                          },
                   finalize: finalizeFunction2
                 }
               )

此操作使用查询字段仅选择那些ord_date大于的文档new Date(01/01/2012)。然后它将结果输出到一个集合map_reduce_example。如果map_reduce_example集合已经存在,则该操作会将现有内容与此 map-reduce 操作的结果合并。

于 2014-04-29T07:58:44.823 回答