Javascript mongodb在子文档数组的数组中获取不同的项 我所拥有的:

Javascript mongodb在子文档数组的数组中获取不同的项 我所拥有的:,javascript,mongodb,aggregation-framework,distinct,subdocument,Javascript,Mongodb,Aggregation Framework,Distinct,Subdocument,我收集了一组患者,每个患者都有一系列治疗的子文档 每个治疗都有一系列诊断(简单字符串) 我想要什么 我想得到所有的患者,不需要治疗(但需要一系列的诊断!) 我还希望获得不重复(不同)的诊断阵列 数据现在看起来如何 我想如何获取数据 如何使用MongoDB聚合框架进行此操作?您可以运行以获得lastTreatment以及获得独特的诊断: db.collection.aggregate([ { $project: { _id: 1,

我收集了一组患者,每个患者都有一系列治疗的子文档

每个治疗都有一系列诊断(简单字符串)

我想要什么 我想得到所有的患者,不需要治疗(但需要一系列的诊断!)

我还希望获得不重复(不同)的诊断阵列

数据现在看起来如何 我想如何获取数据 如何使用MongoDB聚合框架进行此操作?

您可以运行以获得
lastTreatment
以及获得独特的诊断:

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" ] }
                }
            }
        }
    }
])

哇,真是太好了,我甚至都没问上次治疗的事
[
    {
        "_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"]
    },
]
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" ] }
                }
            }
        }
    }
])