mongodb在子文档数组的数组中获取不同的项目

Posted

技术标签:

【中文标题】mongodb在子文档数组的数组中获取不同的项目【英文标题】:mongodb get distinct items in array of subdocument array 【发布时间】:2020-06-26 11:10:01 【问题描述】:

我有什么:

我有一组患者,每个患者都有一系列治疗子文档。

每个治疗都有一个诊断数组(都是简单的字符串)

我想要什么

我想要得到所有的病人,不接受治疗(但有一系列他们的诊断!)

我也想得到没有重复(不同)的诊断数组

数据现在的样子

[
    
        "_id": "5e517d80da6c3746d416f918",
        "firstName": "israel",
        "lastName": "k",
        "maritalStatus": "Single",
        "createdBy": "5e4d918ba81c963ed8d51d25",
        "createdAt": "2020-02-22T19:14:08.152Z",
        "__v": 1,
        "lastTreatment": "2022-03-08T20:29:25.779Z",
        "treatments": [
            
                "diagnoses": [
                    "a",
                    "b"
                ],
                "_id": "5e6555a51567d032640a72f7",
                "visitReason": "balba",
                "treatmentNumber": 1,
                "createdBy": "5e4d918ba81c963ed8d51d25",
                "treatmentDate": "2022-03-08T20:29:25.779Z"
            ,
            
                "diagnoses": [
                    "a",
                    "c"
                ],
                "_id": "5e6555a51567d032640a72f7",
                "visitReason": "blabla",
                "treatmentNumber": 2,
                "createdBy": "5e4d918ba81c963ed8d51d25",
                "treatmentDate": "2022-03-08T20:29:25.779Z"
            
        ]
    ,
]

我想如何获取数据

[
    
        "_id": "5e517d80da6c3746d416f918",
        "firstName": "israel",
        "lastName": "k",
        "maritalStatus": "Single",
        "createdBy": "5e4d918ba81c963ed8d51d25",
        "createdAt": "2020-02-22T19:14:08.152Z",
        "__v": 1,
        "lastTreatment": "2022-03-08T20:29:25.779Z",
        "diagnoses": ["a","b","c"]
    ,
]

如何使用 MongoDB 聚合框架来做到这一点?

【问题讨论】:

【参考方案1】:

您可以运行$max 以获取lastTreatment 和$reduce 以及$setUnion 以获取独特的诊断:

db.collection.aggregate([
    
        $project: 
            _id: 1,
            firstName: 1,
            lastName: 1,
            maritalStatus: 1,
            createdBy: 1,
            createdAt: 1,
            __v: 1,
            lastTreatment:  $max: "$treatments.treatmentDate" ,
            diagnoses: 
                $reduce: 
                    input: "$treatments",
                    initialValue: [],
                    in:  $setUnion: [ "$$value", "$$this.diagnoses" ] 
                
            
        
    
])

Mongo Playground

【讨论】:

哇真的太好了,我什至都没问过上次治疗的事

以上是关于mongodb在子文档数组的数组中获取不同的项目的主要内容,如果未能解决你的问题,请参考以下文章

在子文档 MongoDB 中检索数组

如何在子文档中填充模型实例数组? MongoDB猫鼬

MongoDB在不同文档中汇总数组中的项目数?

如何使用MongoDB过滤子文档中的数组[重复]

仅当数组中的所有元素都符合 MongoDb 中的条件时才获取文档

使用 C# 代码从 MongoDB 数组中获取不同的值,其中它专门匹配某些值