mongodb получает различные элементы в массиве вложенных документов - PullRequest
1 голос
/ 15 марта 2020

Что у меня есть:

У меня есть набор пациентов, у каждого пациента есть множество поддокументов лечения.

у каждого лечения есть массив диагнозов (которые являются простой строкой)

Что я хочу

Я хочу получить всех пациентов без лечения (но с массивом всех их диагнозов!)

Я также хотел бы получить диагнозы массив без дубликатов (различный)

Как теперь выглядят данные

[
    {
        "_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 Ответ

1 голос
/ 15 марта 2020

Вы можете запустить $ max , чтобы получить lastTreatment и $, уменьшить вместе с $ 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" ] }
                }
            }
        }
    }
])

Пн go Детская площадка

...