Запрос MongoDB, который будет отображать значения документа проекта в горизонтальном формате

#mongodb #mongodb-query

Вопрос:

Я пытаюсь создать запрос, который будет проецировать или отображать поле в горизонтальном формате. Ниже приведена моя коллекция образцов и ожидаемый результат. Кстати, я также использую студию jaspersoft для создания отчета, но я думаю, что мой вывод должен быть выполнен в запросе mongodb. Надеюсь, кто-нибудь сможет помочь. Спасибо!

 "_id" : ObjectId("60ddc6f44c893c117141e9b9"),
    "observationvalues" : [ 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9c3"),
            "name" : "Systolic BP",
            "resultvalue" : "88.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9c2"),
            "name" : "Diastolic BP",
            "resultvalue" : "66.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9c1"),
            "name" : "Weight",
            "resultvalue" : "90.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9c5"),
            "name" : "Height",
            "resultvalue" : null
        }
    ],
    "createdat" : ISODate("2021-07-01T13:45:24.679Z"),
    "modifiedat" : ISODate("2021-07-01T13:45:24.679Z"),
    "statusflag" : "A"

"_id" : ObjectId("60ddc6f44c893c117141e8b8"),
    "observationvalues" : [ 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9b3"),
            "name" : "Systolic BP",
            "resultvalue" : "84.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9b2"),
            "name" : "Diastolic BP",
            "resultvalue" : "63.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9b1"),
            "name" : "Weight",
            "resultvalue" : "99.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9b5"),
            "name" : "Height",
            "resultvalue" : 172.00
        }
    ],
    "createdat" : ISODate("2021-07-02T13:45:24.679Z"),
    "modifiedat" : ISODate("2021-07-02T13:45:24.679Z"),
    "statusflag" : "A"



"_id" : ObjectId("60ddc6f44c893c117141e7b7"),
    "observationvalues" : [ 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9a3"),
            "name" : "Systolic BP",
            "resultvalue" : "81.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9a2"),
            "name" : "Diastolic BP",
            "resultvalue" : "65.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9a1"),
            "name" : "Weight",
            "resultvalue" : "96.00"
        }, 
        {
            "_id" : ObjectId("60ddc6f44c893c117141e9a5"),
            "name" : "Height",
            "resultvalue" : 165.00
        }
    ],
    "createdat" : ISODate("2021-07-03T13:45:24.679Z"),
    "modifiedat" : ISODate("2021-07-03T13:45:24.679Z"),
    "statusflag" : "A",
 

Ожидаемый результат будет:

 {"createdat" : "2021-07-01T13:45:24.679Z", "Systolic BP" : 88.00 ,"Diastolic BP" : 66.00 ,"Weight": 90.00 ,"Height":null }
{"createdat" : "2021-07-01T13:45:24.679Z", "Systolic BP" : 84.00 ,"Diastolic BP" : 63.00 ,"Weight": 99.00 ,"Height":172.00 }
{"createdat" : "2021-07-03T13:45:24.679Z", "Systolic BP" : 81.00 ,"Diastolic BP" : 65.00 ,"Weight": 96.00 ,"Height":165.00 }
 

Я создал свой запрос, но у него нет выходных данных в одной строке, сгруппированных для каждого поля createdat

 { 
$project : {
    _id: {
            "systolic":  {"$cond": [ { "$eq": ["$name","Systolic BP" ] }, "$resultvalue","" ] },
            "diastolic":  {"$cond": [ { "$eq": ["$name","Diastolic BP" ] }, "$resultvalue","" ] },
            "weight":  {"$cond": [ { "$eq": ["$name","Weight" ] }, "$resultvalue","" ] },
            "height":  {"$cond": [ { "$eq": ["$name","Height" ] }, "$resultvalue","" ] },
            "create": "$createdat"
        }

            }
},
 

Ответ №1:

Ваш ожидаемый вывод данных может быть выполнен следующим образом: игровая площадка

 [
    {
        "$project": {
            "createdat": 1,
            "rows": {
                "$arrayToObject": {
                    "$map": {
                        "input": "$observationvalues",
                        "in": {
                            "k": "$this.name",
                            "v": {
                                "$convert": {
                                    "input": "$this.resultvalue",
                                    "to": "double",
                                    "onError": null,
                                    "onNull": null
                                }
                            }
                        }
                    }
                }
            }
        }
    },
    {
        "$addFields": {
            "rows.create": "$createdat"
        }
    },
    {
        "$replaceRoot": {
            "newRoot": "$rows"
        }
    },
    {
        "$match": {
            "Systolic BP": 84.00
        }
    }
]
 

Чтобы собрать их в одну строку, вам следует поискать какой-нибудь формат JSON.

Комментарии:

1. Большое спасибо! Это работает, если коллекция или массив не являются $unwind. Что делать, если мне нужно поставить $match? Например, мне нужно только вернуть значение для роста и веса? Кстати, я уже включил ваш код в свой запрос

2. Могу ли я также преобразовать $$this.resultvalue в целое число? в настоящее время он возвращает строковые значения.

3. @JayvenJavier добавил пример совпадения и преобразование чисел. Вы можете преобразовать значения в любые, какие захотите. Преобразование Документов

4. Кроме того, значения возвращаются в виде строк, поскольку они объявлены как строки. Может быть, вы тоже могли бы хранить их в виде цифр.

5. @JayvenJavier отредактировал, потому что агг соответствия был неверным. Вы можете добавить стадию совпадения там, где хотите, в этом случае она добавляется в конце с новым форматом. Позже я сделаю фильтр, чтобы соответствовать ожидаемым документам, прежде чем сопоставлять их.