通过NodeJS对MongoDB进行汇总

时间:2014-01-21 08:56:20

标签: node.js mongodb

在开始之前,我想说明没有其他类似问题的答案适用于此问题。首先考虑以下JSON代码

  "_id": "1412302013-01-20,11:32:22" 
  "display": [
    {
      "Name": "LOG-11-05-SH-O1.mp4",
      "Type": "Startup",
      "Count": 2,
      "Detail": [
        {
          "Start": "2013-01-20,11:32:22",
          "End": "2013-01-20,11:32:30"
        },
        {
          "Start": "2013-01-20,11:32:22",
          "End": "2013-01-20,11:32:30"
        }
      ]
    },
    {
      "Name": "PUR-12-47-SH-X3.mp4",
      "Type": "Movie",
      "Count": "2",
      "Detail": [
        {
          "Start": "2013-01-20,11:32:22",
          "End": "2013-01-20,11:32:30"
        },
        {
          "Start": "2013-01-20,11:32:22",
          "End": "2013-01-20,11:32:30"
        }
      ]
    },

ID基本上是与时间戳同步的车牌号码的组合。 我要做的是汇总"Count"的总和,"Name": "LOG-11-05-SH-O1.mp4"

我甚至无法将简单的总和汇总,因此尝试汇总这笔总和是不可能的。在NodeJS中运行我的脚本时,我得到undefined[object Object]

我不知道出现了什么问题,因为我一直关注各种在线示例。

在尝试使用parvin的答案之后,我仍然未定义:

collection.aggregate([
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
    {$unwind : "$display"},
    {$group : {_id : "$_id", 
               name : {$first : "$display.Name"}, 
               total : {$sum : "$display.Count"}
              }   
    }], function(err, result) {
    console.log("Aggregation: " + result.total);
});

我一直在尝试格式化代码docs

2 个答案:

答案 0 :(得分:3)

aggregate回调的result参数是一个数组,而不是单个值。如果你只是转出result

,你可以看到这个
console.log(result);

所以要访问数组中第一个doc的total

console.log(result[0].total);

但是那将是0,因为你的doc中的Count是一个字符串,而不是一个数字。你不能$sum字符串。

因为您还只想total"Name": "LOG-11-05-SH-O1.mp4"元素,所以您需要在$unwind之后添加另一个过滤器:

collection.aggregate([
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
    {$unwind : "$display"},
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
    {$group : {_id : "$_id", 
               name : {$first : "$display.Name"}, 
               total : {$sum : "$display.Count"}
              }   
    }], function(err, result) {
        console.log(result);
});

答案 1 :(得分:1)

您可以使用以下查询查找Name = "LOG-11-05-SH-O1.mp4"的总计数。这是javascript示例,您必须将其转换为node.js

db.collection.aggregate(
    {$match : {"display.Name" : "LOG-11-05-SH-O1.mp4"}},
    {$unwind : "$display"},
    {$group : {_id : "$_id", 
               name : {$first : "$display.Name"}, 
               total : {$sum : "$display.Count"}
    }}
)