MongoDB聚合中字段和数组的总和

时间:2016-08-12 10:38:16

标签: javascript mongodb

我有一个包含数组 Private Function GetCurrentTime(ByVal dtnew As String) As DateTime Dim oaDate As DateTime Dim timeValue As DateTime Dim dtNow As DateTime 'Final date time to be stored in the time field oaDate = DateTime.FromOADate(0) dtnew = String.Concat(oaDate.Year, oaDate.Month, oaDate.Day, dtnew) dtnew = dtnew.Replace(":", String.Empty) dtNow = DateTime.ParseExact(dtnew, "yyyyMMddHHmm", Globalization.CultureInfo.InvariantCulture) 'Convert.ToDateTime(dtnew).ToString("HH:mm") timeValue = dtNow 'New DateTime(oaDate.Year, oaDate.Month, oaDate.Day, dtNow.Hour, dtNow.Minute, dtNow.Second) Return timeValue End Function 和字段an_array的集合。数组可以由值组成(数组可能为空),它也可以存在于a_field中。

我想创建一个汇总函数,该函数汇总a_fielda_field中的值数。

编辑:例如我想计算an_array1a_field使用an_array的次数。

例如,如果我有一些看起来像这样的文件:

{
  a_field: 1,
  an_array: [ 1, 3, 4 ],
},
{
  a_field: 3,
  an_array: [],
}
{
  a_field: 2,
  an_array: [ 1 ],
}

我希望看到这样的输出:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 2, a_count: 1, b_count: 0 }, { _id: 3, a_count: 1, b_count: 1 }, { _id: 4, a_count: 0, b_count: 1 } ]

但是我得到这样的输出:

[ { _id: 1, a_count: 1, b_count: 2 }, { _id: 3, a_count: 1, b_count: 1 }, { _id:4,  a_count: 1, b_count: 1 } ]

哪个不正确,因为它缺少_id 2,而_id 4的计数太多。

我面临的问题是,当an_array为空时,如果数组为空,我将无法正确检索所有计数,并且它获得的a_count的值不是#39; t始终与实际ID匹配(如_id 4中所示)。

到目前为止我所拥有的是:

db.getCollection('test').aggregate( [
    { $match: { 
        a_field: { 
            $ne: null 
        } 
    } },

    { $group: { 
        _id: '$a_field', 
        a_count: { 
            $sum: 1 
        }, 
        an_array: { 
            $push: {
                an_array: '$an_array'
            }
        }
     } },

    { $project: {
        an_array: 1,
        a_count: 1
    } },

    { $unwind: '$an_array' },
    { $unwind: '$an_array.an_array' },

    { $group: {
        _id: '$an_array.an_array',
        b_count: {
            $sum: 1
        },
        a_count: {
            $first: '$a_count'
        }
    } }, 
] );

我真的很感激一些意见,因为我喜欢在一个单一的聚合中做到这一点。在这一点上,这已成为一种个人追求,而不是实际的实施。谢谢!

编辑:我现在已经绑定到MongoDB 2.6了。

1 个答案:

答案 0 :(得分:1)

使用$size作为数组字段,这是你幸运的男孩v2.6的新功能!

此外,我不明白为什么你想要尝试计算$a_field - 因为它不是一个数组而总是会成为一个元素 - 所以这个聚合只包括$a_field作为结果中_id的内容。您知道$a_field的计数始终为1,因为它不是数组:

db.test.aggregate([{
  $match: {
    a_field: {
      $ne: null
    }
  }
}, {
 $group: {
    _id: '$a_field',
    an_array_size: {
      $size: '$an_array'
    }
  }
}])

控制台输出示例:

> db.test.find({});
{
  "_id": ObjectId("57ada868700ca97222421d8b"),
  "a_field": 1,
  "an_array": [1, 3, 4]
}

> db.test.aggregate([{
  $match: {
    a_field: {
      $ne: null
    }
  }
}, {
 $group: {
    _id: '$a_field',
    an_array_size: {
      $size: '$an_array'
    }
  }
}])
{
  "result": [{
    "_id": 1,
    "an_array_size": 3
  }],
  "ok": 1
}