обрабатывать / запрашивать несколько вложенных документов в mongodb с помощью драйвера Java - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть документ типа

{
"_id" : ObjectId("5bfdb66f0f77e33b90f53fad"),
"email" : "amit@gmail.com",
"appointments" : [
    {
        "year" : "2018",
        "months" : "12",
        "day" : "31",
        "hour" : "10",
        "minute" : "30",
        "doctorsName" : "Doc 1",
        "hospitalName" : "Place 1",
        "sortOrder" : "201812311030"
    },
    {
        "year" : "2018",
        "months" : "09",
        "day" : "31",
        "hour" : "10",
        "minute" : "30",
        "doctorsName" : "Doc 1",
        "hospitalName" : "Place 1",
        "sortOrder" : "201809311030"
    },
    {
        "year" : "2018",
        "months" : "11",
        "day" : "30",
        "hour" : "05",
        "minute" : "30",
        "doctorsName" : "Doc 1",
        "hospitalName" : "Place 1",
        "sortOrder" : "201811300530"
    }
],
"medicalData" : [
    {
        "year" : "2018",
        "months" : "09",
        "day" : "31",
        "symptomsList" : [“headache”,“nausea”,"cough"],
        "weight" : "70",
        "bloodPressureSystolic" : "120",
        "bloodPressureDiastolic" : "80",
        "medications" : [“med 1”,“med 2”],
        "sortOrder" : "20180931"
    },
    {
        "year" : "2018",
        "months" : "10",
        "day" : "31",
        "symptomsList" : [“headache”,"cough","Vomiting","Body Pain"],
        "weight" : "70",
        "bloodPressureSystolic" : "120",
        "bloodPressureDiastolic" : "80",
        "medications" : [“med 1”,“med 2”,"med 3"],
        "sortOrder" : "20181031"
    }
]
}

Я хочу обработать оба поддокумента на основе разных параметров.С помощью Агрегатора я попробовал.Но не смог добиться успеха.

Я хочу, чтобы данные со всеми полями и данными встреч были больше определенного сортировщика (order1), а медицинские данные равны другому значению сортировщика (order2).только одна медицинская информация будет доступна для этого конкретного сортировщика.Прямо сейчас я пишу два запроса, один для Назначения и другой для Медицинских Данных, и объединяю их для создания полного JSON.

Тип вывода, который я хочу:

{
   "email" : "amit@gmail.com",
   “appointments”:
          [{
                “year”:2018,
                “month”:8,
                “day”:1,
                “hour”:7,
                “minutes”:6,
                “doctorName”:”Doc 1”,
                “hospitalName”:”Place 1”
            },
            {
                “year”:2018,
                “month”:10,
                “day”:15,
                “hour”:11,
                “minutes”:16,
                “doctorName”:”Doc 1”,
                “hospitalName”:”Place 1”
             }],
   “symptoms”: [“headache”,“nausea”],
   “bloodPressureSystolic”:120,
   “bloodPressureDiastolic”:80,
   “weight”: 58.5,
   “medications”:[“med 1”,“med 2”]
   }

Пожалуйста, игнорируйте несоответствие данных в ожидаемом результате.

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Спасибо @Senthur Deva, вот как я реализовал в Java

    DBObject filterAppointment = new BasicDBObject();
    filterAppointment.put("input", "$appointments");
    filterAppointment.put("as", "apnmt");
    filterAppointment.put("cond", new BasicDBObject("$gt", Arrays.<Object>asList("$$apnmt.sortOrder", sortOrder1)));

    BasicDBObject projectionAppointment = new BasicDBObject("$filter", filterAppointment);

    DBObject filterMedData = new BasicDBObject();
    filterMedData.put("input", "$medicalData");
    filterMedData.put("as", "med");
    filterMedData.put("cond", new BasicDBObject("$eq", Arrays.<Object>asList("$$med.sortOrder", sortOrder)));

    BasicDBObject projectionMedData = new BasicDBObject("$filter", filterMedData);

    AggregateIterable<Document> findIterable = usersCollection.aggregate(
            Arrays.asList(
                    new Document("$match", new Document("_id",new ObjectId(userId))),
                    new Document("$project",new Document("email",1)
                                .append("appointments", projectionAppointment)
                                .append("medicalData", projectionMedData)),
                    new Document("$addFields",new Document("medicalData",new Document("$arrayElemAt", Arrays.asList("$medicalData", 0)))),
                    new Document("$project",new Document("email",1)
                                .append("appointments", 1)
                                .append("year", "$medicalData.year")
                                .append("months", "$medicalData.months")
                                .append("day", "$medicalData.day")
                                .append("symptomsList", "$medicalData.symptomsList")
                                .append("weight", "$medicalData.weight")
                                .append("bloodPressureSystolic", "$medicalData.bloodPressureSystolic")
                                .append("bloodPressureDiastolic", "$medicalData.bloodPressureDiastolic")
                                .append("medications", "$medicalData.medications")
                                .append("sortOrder", "$medicalData.sortOrder"))

                )   
        );
0 голосов
/ 30 ноября 2018

попробуйте Mongo Playground

db.col.aggregate([
    {
        "$project": {
            "email": 1,
            "appointments": {
                "$filter": {
                    "input": "$appointments",
                    "as": "apnmt",
                    "cond": {
                        "$gt": ["$$apnmt.sortOrder", "201811300530"]
                    }
                }
            },
            "medicalData": {
                "$filter": {
                    "input": "$medicalData",
                    "as": "med",
                    "cond": { "$eq": ["$$med.sortOrder", "20180931"] }
                }
            }
        }
    },
    {
        "$addFields": {
            "medicalData": { "$arrayElemAt": ["$medicalData", 0] }
        }
    },
    {
        "$project": {
            "email": 1,
            "appointments": 1,
            "year": "$medicalData.year",
            "months": "$medicalData.months",
            "day": "$medicalData.day",
            "symptomsList": "$medicalData.symptomsList",
            "weight": "$medicalData.weight",
            "bloodPressureSystolic": "$medicalData.bloodPressureSystolic",
            "bloodPressureDiastolic": "$medicalData.bloodPressureDiastolic",
            "medications": "$medicalData.medications",
            "sortOrder": "$medicalData.sortOrder"
        }
    }
])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...