MongoDB聚合组并计数嵌套数组

时间:2020-07-20 12:22:38

标签: mongodb

我是MongoDB的新手,请尝试使用此数据进行汇总

db.probes.insertMany([
{ '_id' : 1, 'item' : 'abc', 'ts' : new Date('2014-03-01T08:00:00Z'), 'probs' : ['P1', 'P2', 'P3', 'P4', 'P5'] },
{ '_id' : 2, 'item' : 'jkl', 'ts' : new Date('2014-03-01T09:00:00Z'), 'probs' : ['P2', 'P3', 'P4', 'P5'] },
{ '_id' : 3, 'item' : 'xyz', 'ts' : new Date('2014-03-15T09:00:00Z'), 'probs' : ['P3', 'P4', 'P5'] },
{ '_id' : 4, 'item' : 'xyz', 'ts' : new Date('2014-04-04T11:21:39.736Z'), 'probs' : ['P4', 'P5'] },
{ '_id' : 5, 'item' : 'abc', 'ts' : new Date('2014-04-04T21:23:13.331Z'), 'probs' : ['P5'] }
]);

我想对嵌套数组进行分组和计数,如何获得这样的输出?

//输出1

{
    'P1' : 1, 'P2' : 2, 'P3' : 3, 'P4' : 4, 'P5' : 5,
}

//输出2

{
    { 'P1' : 1, 'ts' : { 2014-03-01T08:00:00Z } },
    { 'P2' : 2, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z } },
    { 'P3' : 3, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z, 2014-03-15T09:00:00Z } }
    { 'P4' : 4, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z, 2014-03-15T09:00:00Z, 2014-04-04T11:21:39.736Z } } }
}

//输出3

{
    { 'P1' : { 'count' : 1, 'ts' : { 2014-03-01T08:00:00Z } },
    { 'P2' : { 'count' : 2, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z } },
    { 'P3' : { 'count' : 3, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z, 2014-03-15T09:00:00Z } }
    { 'P4' : { 'count' : 4, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z, 2014-03-15T09:00:00Z, 2014-04-04T11:21:39.736Z } } }
    { 'P5' : { 'count' : 5, 'ts' : { 2014-03-01T08:00:00Z, 2014-03-01T09:00:00Z, 2014-03-15T09:00:00Z, 2014-04-04T11:21:39.736Z, 2014-04-04T21:23:13.331Z } } }
}

1 个答案:

答案 0 :(得分:0)

您需要组合$unwind$group$addToSet。例如:

db.collection.aggregate([
  {
    $unwind: "$probs"
  },
  {
    $group: {
      _id: "$probs",
      count: {
        $sum: 1
      },
      ts: {
        $addToSet: "$ts"
      }
    }
  }
])

https://mongoplayground.net/p/c4O5zfxhRCl

您可以将其用作所有所需格式的基础。