Mongodb 是否可以聚合对象?

标签 mongodb

我正在尝试聚合本文档中的数据包总数。

{
    "_id" : ObjectId("51a6cd102769c63e65061bda"),
    "capture" : "1369885967",
    "packets" : {
        "0" : "595",
        "1" : "596",
        "2" : "595",
        "3" : "595",
        ...
    }
}

我能得到的最接近的是大约

db.collection.aggregate({ $match: { capture : "1369885967" } }, {$group: { _id:null, sum: {$sum:"$packets"}}});

但是它返回 sum 0,这显然是错误的。

{ "result" : [ { "_id" : null, "sum" : 0 } ], "ok" : 1 }

如何获得所有数据包的总和?

最佳答案

由于您的值位于对象而不是数组中,因此您需要使用mapReduce。

// Emit the values as integers

var mapFunction = 
  function() {
    for (key in this.packets) {
      emit(null, parseInt(this.packets[key]));
    }
  }

// Reduce to a simple sum

var reduceFunction = 
  function(key, values) {
    return Array.sum(values);
  }

> db.collection.mapReduce(mapFunction, reduceFunction, {out: {inline:1}})
{
    "results" : [
        {
            "_id" : null,
            "value" : 2381
        }
    ],
    "ok" : 1,
}

如果可能的话,您应该将值作为数字类型的数组发出,因为这为您提供了更多选项(即聚合)并且(除非数据集很大)可能会带来性能优势。

关于Mongodb 是否可以聚合对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16832035/

相关文章:

Node.js、mongodb 和过滤查询

java - 需要在 spring mongotemplate 中复制查询

mongodb - 如何在不使用简单模式的情况下关联/关联到 Meteor 中的 Mongo 集合

mongodb - Meteor 客户端排序 Collection

mongodb - 在TS文件中编写mongo shell脚本

java - 是否可以在 mongo 的组聚合后重命名 _id 字段?

r - Mongolite 未将带有列表列的数据框正确插入 Mongodb

mongodb - 将多边形插入 MongoDB 写入空值而不是坐标(在 Meteor 1.1.0.2 上)

node.js - 我不知道如何使用 nodejs native 驱动程序打印 mongodb 查询结果

mysql - 指标数据库编号保存约定?