【问题标题】:group documents by array of objects按对象数组对文档进行分组
【发布时间】:2021-05-05 23:02:08
【问题描述】:

文档示例

{
  _id: 1,
  entity: 'Transaction',
  approvals: [
    {
      userId: 1, // ObjectID
      final: true,
      approved: false,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 1,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
},
{
  _id: 2,
  entity: 'Transaction',
  approvals: [
    {
      userId: 1,
      final: true,
      approved: false,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 1,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
},
{
  _id: 3,
  entity: 'Transaction',
  approvals: [
    {
      userId: 1,
      final: true,
      approved: true,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 2,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
},
{
  _id: 4,
  entity: 'Transaction',
  approvals: [
    {
      userId: 1,
      final: true,
      approved: true,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 2,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
}

我想按照以下标准对此类文档进行分组:

  • 实体
  • approvals.approved
  • approvals.userId
  • approvals.final
  • approvals.date

approvals 数组可以包含多个值,可能未排序,因为我需要按日期对它们进行排序;如果批准数量不同 - 两个对象属于不同的组。 这可能与使用 Mongodb 4.2 设施有关吗?最有效的方法是什么?我在考虑生成哈希,但不确定 MongoDB 是否有这样的功能。

想要的结果:

{
  ids: [1, 2],
  entity: 'Transaction',
  approvals: [
    {
      userId: 1,
      final: true,
      approved: false,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 1,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
}
{
  ids: [3, 4],
  entity: 'Transaction',
  approvals: [
    {
      userId: 1,
      final: true,
      approved: true,
      date: ISODate('2021-01-01'),
    },
    {
      userId: 2,
      final: true,
      approved: false,
      date: ISODate('2021-02-01'),
    }
  ]
}

【问题讨论】:

    标签: mongodb aggregation


    【解决方案1】:

    可能是这样的:

     mongos> db.h.aggregate([      { $unwind:"$approvals"}   , {$group:{ _id:{ ent:"$entity" , app:"$approvals.approved" , fin:"$approvals.final" ,dat:"$approvals.date"  } ,count:{$sum:1}    }} , {$sort:{dat:1}}  ])
     { "_id" : { "ent" : "Transaction", "app" : true, "fin" : true, "dat" : ISODate("2021-02-01T19:35:37.883Z") }, "count" : 1 }
     { "_id" : { "ent" : "Transaction", "app" : true, "fin" : true, "dat" : ISODate("2021-02-01T19:41:37.931Z") }, "count" : 1 }
    

    【讨论】:

    • 不幸的是,这不起作用,我刚刚测试了这个,并且在一个集合中有 2 个文档,我在这样聚合 3 个文档后得到了结果;显然组数不能超过我要分组的文档
    • 也许您需要不同的标准,请提供所需的输出?
    • 提供的数据和期望的结果
    猜你喜欢
    • 1970-01-01
    • 2019-01-30
    • 2018-05-01
    • 1970-01-01
    • 2022-01-14
    • 2020-02-29
    • 1970-01-01
    • 1970-01-01
    • 2023-01-12
    相关资源
    最近更新 更多