我想创建一个地图并进行查询。我来自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似乎不正确。
答案 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",
});