【问题标题】:MongoDB aggregate group and count nested arrayMongoDB聚合组和计数嵌套数组
【发布时间】:2020-11-09 16:48:29
【问题描述】:

我是 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 } } }
}

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

    https://mongoplayground.net/p/c4O5zfxhRCl

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

    【讨论】:

    • 您的指导可以帮助我节省大量时间。谢谢你,祝你有美好的一天。
    • @psodaz 没问题。请将答案标记为已接受,必须获得这些互联网积分。谢谢!
    猜你喜欢
    • 2017-07-26
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 2021-12-31
    • 2021-06-27
    • 2015-12-06
    • 1970-01-01
    • 2021-04-19
    相关资源
    最近更新 更多