我如何使用带有 MongoDB 和 JS 的 map-reduce 来获得它?
How can I use map-reduce with MongoDB and JS to obtain this?
我是 JS 的新手,所以我在使用 map reduce 和 mongodb 时遇到了一些大问题,因为我缺乏知识,我有一个名为 dailyAlerts[=20= 的集合]:
{
"_id" : 25,
"title" : "Other… Title Test Polygon 2",
"alertDescription" : "Other… Description Test Polygon 2",
"alertDateTime" : 1507784400100,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 9,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}{
"_id" : 26,
"title" : "Other… Title Test Polygon 4",
"alertDescription" : "Other… Description Test Polygon 4",
"alertDateTime" : 1507784400100,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 5,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}
{
"_id" : 27,
"title" : "Other… Title Test Polygon 6",
"alertDescription" : "Other… Description Test Polygon 6",
"alertDateTime" : 1507784400500,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 1,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}
这里的重要字段是 "alertType",我想使用 map reduce 来根据 alertType 给我所有警报的计数(可用值是 1-9),否则如果没有文档则放 0找到了 alertType,我还需要向我展示所有处理过的文档的总数,以便将它们插入到另一个集合中,如下所示:
{
"_id" : 4,
"dateRecord" : 3500,
"type1Count" : 0,
"type2Count" : 10,
"type3Count" : 20,
"type4Count" : 30,
"type5Count" : 0,
"type6Count" : 50,
"type7Count" : 60,
"type8Count" : 70,
"type9Count" : 80,
"totalCount" : 320,
}
非常感谢你的帮助。
我假设您的问题与所需输出中的前两个 属性 值无关。可以使用 reduce
收集计数,如下所示:
var data = [{ "alertType" : 9 }, { "alertType" : 5 }, { "alertType" : 1 }];
var counts = data.reduce ( (counts, obj) => {
counts[obj.alertType]++;
return counts;
}, Array(10).fill(0) );
console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这个 returns 数组,在索引 k 处,您会找到 alertType = k
出现的次数。由于数组也有索引 0,因此第一个值将始终为 0。您当然可以将其转换为非数组对象或任何其他数据结构。
我是 JS 的新手,所以我在使用 map reduce 和 mongodb 时遇到了一些大问题,因为我缺乏知识,我有一个名为 dailyAlerts[=20= 的集合]:
{
"_id" : 25,
"title" : "Other… Title Test Polygon 2",
"alertDescription" : "Other… Description Test Polygon 2",
"alertDateTime" : 1507784400100,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 9,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}{
"_id" : 26,
"title" : "Other… Title Test Polygon 4",
"alertDescription" : "Other… Description Test Polygon 4",
"alertDateTime" : 1507784400100,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 5,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}
{
"_id" : 27,
"title" : "Other… Title Test Polygon 6",
"alertDescription" : "Other… Description Test Polygon 6",
"alertDateTime" : 1507784400500,
"alertLatitude" : 20.5774756,
"alertLongitude" : -103.3795262,
"alertType" : 1,
"userName" : "Azgad",
"photoLink" : "www.google.com",
"videoLink" : "www.google.com",
"__v" : 0
}
这里的重要字段是 "alertType",我想使用 map reduce 来根据 alertType 给我所有警报的计数(可用值是 1-9),否则如果没有文档则放 0找到了 alertType,我还需要向我展示所有处理过的文档的总数,以便将它们插入到另一个集合中,如下所示:
{
"_id" : 4,
"dateRecord" : 3500,
"type1Count" : 0,
"type2Count" : 10,
"type3Count" : 20,
"type4Count" : 30,
"type5Count" : 0,
"type6Count" : 50,
"type7Count" : 60,
"type8Count" : 70,
"type9Count" : 80,
"totalCount" : 320,
}
非常感谢你的帮助。
我假设您的问题与所需输出中的前两个 属性 值无关。可以使用 reduce
收集计数,如下所示:
var data = [{ "alertType" : 9 }, { "alertType" : 5 }, { "alertType" : 1 }];
var counts = data.reduce ( (counts, obj) => {
counts[obj.alertType]++;
return counts;
}, Array(10).fill(0) );
console.log(counts);
.as-console-wrapper { max-height: 100% !important; top: 0; }
这个 returns 数组,在索引 k 处,您会找到 alertType = k
出现的次数。由于数组也有索引 0,因此第一个值将始终为 0。您当然可以将其转换为非数组对象或任何其他数据结构。