MongoDB:不减少映射?

时间:2017-08-12 17:25:48

标签: mongodb mapreduce views

我想创建一个地图并进行查询。我来自CouchDB,它允许带有视图。 MongoDB可能会出现这种情况,并且增量Map / Reduce正确吗?

示例:获取一些文档,并在处理完日期后每行发出一行,并查询结果。

文件:

{
   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键的存在。因此,更复杂查询的聚合pipline似乎不正确。

1 个答案:

答案 0 :(得分: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",
 });