微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

聚合查询从嵌套子文档中获取最新元素的计数

如何解决聚合查询从嵌套子文档中获取最新元素的计数

我有一个包含许多用户的 mongodb 数据库,我跟踪的其中一个子文档是文件上传及其通过审核过程的状态。每个文件上传最终都会有一个附件状态。我希望能够提取一些指标来获取每个上传文件的当前状态总数。我开始构建一个聚合查询,从上传的每个文件提取最新的附件子文档状态并对其进行计数。

数据结构如下:

 "userName": "johnDoe","email": "johnDoe@gmail.com","uploads" : [
                {
                        "_id" : ObjectId("adh12451e0012ce9da0"),"fileName" : "TestDoc.txt","fileType" : "text/plain","created" : ISODate("2021-01-06T15:26:14.166Z"),"attachmentStatus" : [ ]
                },{
                        "_id" : ObjectId("5ff5d6c066cacc0012ed655a"),"fileName" : "testeraBC.txt","created" : ISODate("2021-01-06T15:26:56.027Z"),"attachmentStatus" : [
                                {
                                        "_id" : ObjectId("60884f733f88bd00129b9ad4"),"status" : "Uploaded","date" : ISODate("2021-04-22T02:23:00Z")
                                },{
                                        "_id" : ObjectId("60884f733f88bd00129b9ad5"),"status" : "Processing","date" : ISODate("2021-04-26T04:54:00Z")
                                }
                        ]
                },{
                        "_id" : ObjectId("6075c82a19fdcc0012f81907"),"fileName" : "Test file.docx","fileType" : "application/word","created" : ISODate("2021-04-13T16:34:50.955Z"),"attachmentStatus" : [
                                {
                                        "_id" : ObjectId("72844f733f88bd11479b9ad7"),"date" : ISODate("2021-04-23T03:42:00Z")
                                },{
                                        "_id" : ObjectId("724986d73f88bd00147c9wt8"),"status" : "Completed","date" : ISODate("2021-04-24T01:37:00Z")
                                }
                        ]
                }
        ]

 "userName": "janeDoe","email": "janeDoe@gmail.com","uploads" : [
                {
                        "_id" : ObjectId("ej9784652h0012ce9da0"),"fileName" : "myResume.txt","created" : ISODate("2021-02-13T12:36:14.166Z"),"attachmentStatus" : [
                                {
                                        "_id" : ObjectId("15dhdf6f88bd00147c9wt8"),"date" : ISODate("2021-04-24T01:37:00Z")
                                }
                  ]
                },

如何为每个上传文件提取最新的附件状态,然后汇总状态?

我想要这样的东西:

{ "status" : "Completed","Count" : 2 }
{ "status" : "Processing","Count" : 1 }
...

我非常接近这个聚合查询,但它会获取每个状态,而不仅仅是每个文件的单个最新状态。 (每个文件一个当前状态)。

db.myDB.aggregate([
{
  "$match" : {
    "uploads.attachmentStatus": {
      "$elemmatch": { "status": { "$exists": true } }
      }
    }
},{ $unwind: "$uploads"},{ $unwind: "$uploads.attachmentStatus"},{
  $sortByCount: "$uploads.attachmentStatus.status"
},{
  $project: {
    _id:0,status: "$_id",Count: "$count"
  }
}
]).pretty();

有什么建议吗?

解决方法

演示 - https://mongoplayground.net/p/zzOR9qhqny0


  • { $sort: { "uploads.attachmentStatus.date": -1 } }, 获取最新的第一个

  • { $group: { _id: "$uploads._id",status: { $first: "$uploads.attachmentStatus.status" } } } 按uploads._id 对记录进行分组并取顶部状态(按日期排序后的最新状态)。

查询

{ $sort: { "uploads.attachmentStatus.date": -1 } },{ $group: { _id: "$uploads._id",status: { $first: "$uploads.attachmentStatus.status" } } },

完成查询

db.collection.aggregate([
  { $match: { "uploads.attachmentStatus": { "$elemMatch": {  "status": { "$exists": true } } } } },{ $unwind: "$uploads" },{ $unwind: "$uploads.attachmentStatus" },{ $sort: { "uploads.attachmentStatus.date": -1 } },{ $sortByCount: "$status" },{ $project: { _id: 0,status: "$_id",Count: "$count" } }
])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。