2017-08-12 176 views
0

我想創建一個映射並進行查詢。我來自CouchDB,它允許使用視圖。 這與MongoDB可能的東西是一樣的,是增量式地圖/減少正確的事情?MongoDB:映射沒有減少?

示例:取一些文檔,並在處理結果並查詢結果後,按照每個待處理的日期排出一行。

文獻:

{ 
    name: "Max", 
    todos: [ 
     { 
     title: "Bring milk home.", 
     isImportant: true, 
     date: 1502557780 
     } 
    ] 
} 

樣本映射函數:

function() { 
    for (var i = 0; i < this.todos.length; i++) { 
     if (this.todos[i].isImportant) { 
     emit(this.todos[i].date, {title: this.todos[i].title}) 
     } 
    } 
} 

輸出:

{ 
    key: 1502557780, 
    value: {title: "Bring milk home."} 
} 

查詢的輸出:

db.collection.find({key: { $lt: 1502557785 }}, ... 

實際上,我想在映射函數中執行一些更復雜的處理,而不僅僅是檢查isImportant鍵的存在。所以更復雜的查詢的聚合管線似乎並不正確。

回答

0

MongoDB中,您可以使用Aggregation Pipeline Operators這樣的:

db.collection.aggregate( 
    [ 
     { 
      $unwind: "$todos" 
     }, 
     { 
      $match: { 
       "todos.isImportant": true 
      } 
     }, 
     { 
      $project: { 
       key: "$todos.date", 
       value: { title: "$todos.title" } 
      } 
     }, 
     { 
      $match: { 
       key: { $lt: 1502557785 } 
      } 
     } 
     // And so on ... 
    ] 
); 

另一種方法是使用Map-Reduce這樣的:

db.runCommand({ 
    mapReduce: "c", 
    map: function() { 
       for (var i = 0; i < this.todos.length; i++) { 
        if (this.todos[i].isImportant) { 
         emit(this.todos[i].date, {title: this.todos[i].title}) 
        } 
       } 
      }, 
    reduce: function (key, values) { 
       return values; 
      }, 
    out: { "inline" : 1}, 
    query: {}, 
    sort: {}, 
    limit: 100, 
    inputDB: "Test", 
}); 
+0

是的,這是indead的方式實現上面的例子在MongoDB中。實際上,我想在每個文檔上運行類似地圖的功能以進行更復雜的修改。 – Bernd

+0

@Bernd如果你想要更復雜的修改;所以你可以在我的答案中使用'mapReduce'類似的例子;)。 –