2012-05-09 27 views

回答

12

理想情況下,一個結構良好的map-reduce查詢將允許您跳過集合中的特定文檔。

或者,正如塞爾吉奧指出的那樣,您可以簡單地不在map()中發出特定的文檔。使用範圍來定義全局計數器變量是限制發射到指定文檔範圍的一種方法。舉個例子,跳過第20個文檔由對象ID進行排序(因此,通過插入時間排序):

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

地圖功能:

function(){ 
    counter ++; 
    if (counter > 20){ 
     emit(key, value); 
    } 
} 
+0

謝謝你,這是我想要的。 –

0

我不知道,因爲哪個版本此功能是可用的,但肯定在MongoDB中2.6 mapReduce() function provides query parameter

query文件

可選。使用查詢運算符指定選擇標準,以確定輸入到地圖 函數的文檔。

考慮下面的地圖,減少對包含以下原型文檔的集合訂單的操作:

{ 
    _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函數。

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操作的結果。

相關問題