【发布时间】:2017-11-07 11:28:42
【问题描述】:
我使用的是 map reduce 而不是聚合框架,因为我做了一些字符串操作和值检查。
我有一个查询,它返回具有特定操作系统的设备计数。例如。我已经实现的一个查询返回的结果如下所示:[{"_id":"Android","value":800}, {"_id":"Windows Phone","value":50}]
我已经在使用query 参数来提高性能。现在我想使用 map reduce,结果应该按设备所在的建筑物分组。
数据库结构:
包含多个文档的集合,这些文档具有以下属性:OperatingSystem、Building
{ “_id”:ObjectId(“5a0174c616bcd022e04fcc43”), “操作系统”:“安卓”, "建筑": xy"}
注意:这是简化的,例如OperatingSystem 包含字符串中的版本号,但我已经在处理它了。
到目前为止我所尝试的:
let map = function () {
// some manipulation of property values
// type checks + error handling
emit({op: this.operatingSystem, this.building], 1);
}
let reduce = function (key, values) {
return Array.sum(values);
}
但结果不是我想要的格式:
[{"_id":"Android","value":222}, {"_id":{"operatingSystem":"Windows Phone","building":"xy"},"value":2} , {"_id":{"operatingSystem":"Android","building":"xy"},"value":5}]
结果的问题:关键应该只是建筑物,属性应该是操作系统以及它们对特定建筑物的计数,第一个条目是无用的,不应该是结果的一部分。
结果应该是这样的:
[{"Building": "xy", "deviceCounts": [{"Android": 50}, "Windows Phone": 20}]}, {"Building: zz" //......
如何通过操作系统和在同一属性中构建密钥并保存设备数?
【问题讨论】:
标签: mongodb mapreduce mongodb-query