Возврат нескольких значений из групповых фильтров отличия - Mongodb - PullRequest
0 голосов
/ 20 декабря 2018

Я хочу вернуть два типа групповых результатов в одном запросе, но это не работает.

Если у вас есть одна идея, пожалуйста, поделитесь со мной.

У меня есть эта коллекция:

[
    {
        _id: "ABC00001",
        results: [
            {   
                _id: "C0001",
                status: {
                    _id: "stj001",
                    name: "status1"
                },
                test:{
                    profession: [
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst006",
                                    "name" : "University 3"
                                }
                            },
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst002",
                                    "name" : "University 2"
                                }
                            }
                        ]
                }
            },
            {   
                _id: "C0002",
                status: {
                    _id: "stj002",
                    name: "status1"
                },
                test:{
                    profession: [
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst006",
                                    "name" : "University 3"
                                }
                            }
                        ]
                }
            },
        ]
    },
    {
        _id: "ABC00002",
        results: [
            {   
                _id: "C0001",
                status: {
                    _id: "stj002",
                    name: "status1"
                },
                test:{
                    profession: [
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst002",
                                    "name" : "University 2"
                                }
                            },
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst006",
                                    "name" : "University 3"
                                }
                            }
                        ]
                }
            },
            {   
                _id: "C0002",
                status: {
                    _id: "stj003",
                    name: "status1"
                },
                test:{
                    profession: [
                            {
                                "level" : "Pregrado",
                                "institution" : {
                                    "_id" : "inst006",
                                    "name" : "University 3"
                                }
                            }
                        ]
                }
            },
        ]
    },

]

Я хочу вернуть только отдельные учреждения и статус в одном групповом запросе, например:

institution: [
    {"_id" : "inst006","name" : "University 3"},
    {"_id" : "inst002", "name" : "University 2"},
]

status: [
    {_id: "stj002", name: "status1"},
    {_id: "stj003", name: "status1"}
]

Я пытался с этим, но неработа:

db.collection.aggregate(
[
  {'$unwind' : '$results'},
  {'$group' : { '_id' : { 'status' : {'_id'=>'$results.status._id', 'name' : '$results.status.name'}, 'count' : { '$sum' : 1 } } } },
  {'$group' : { '_id' : { 'institution' : {'_id' :'$results.test.profession.institution._id', 'name':'$results.test.profession.institution.name'}, 
                  'count' : { '$sum'  1 } } }
]
)

Если я работаю с двумя отличающимися запросами с их собственной группой, это работает, но мне нужен только один запрос, возвращающий все значения, возможно, я добавлю больше групп

Ответы [ 2 ]

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

Я нашел решение:

db.collection.aggregate([
                {'$match' : {'_id' :  "CA0001"] ],
                {'$unwind' : '$results'],
                {'$unwind' : '$results.test'],
                {'$unwind' : '$results.test.profession'],
                {'$unwind' : '$results.test.skills'],
                {'$group' : {
                  '_id' : {
                    "status" : {'_id':'$results.status.id', 'name':'$results.status.name'}, 
                    "institution" : {'_id':'$results.test.profession.institution._id', 'name':'$results.test.profession.institution.name'},
                    'profession' => {'_id':'$results.test.profession.education._id', 'description':'$results.test.profession.education.description'},
                    'availability' : {'_id':'$results.availability._id', 'name':'$results.availability.name'},
                    'skills' : {'_id':'$results.test.skills._id', 'description':'$results.test.skills.description'}
                  },
                  }
                },  
                {'$project' : { 'status' : 1, 'institution': 1, 'profession': 1, 'skills': 1, 'availability': 1} },
                {
                  '$group' : {
                    '_id' : null,
                    'status' : {
                        '$addToSet' : '$_id.status'
                    },
                    'institution' : {
                        '$addToSet' : '$_id.institution'
                    },
                    'profession' : {
                        '$addToSet' : '$_id.profession'
                    },
                    'availability' : {
                        '$addToSet' : '$_id.availability'
                    },
                    'skills' : {
                        '$addToSet' : '$_id.skills'
                    }
                  }
                }
            ]);

оно возвращает:

{
        "_id": null,
        "status": [
            {
                "_id": 1,
                "name": "evaluado"
            }
        ],
        "institution": [
            {
                "_id": "inst078",
                "name": "Universidad Privada del Norte"
            },
            {
                "_id": "inst079",
                "name": "Universidad San Ignacio de Loyola"
            }
        ],
        "profession": [
            {
                "_id": "fa059",
                "description": "Estadística"
            },
            {
                "_id": "fa063",
                "description": "Ingeniería Informática"
            },
        "availability": [
            {
                "_id": "wo001",
                "name": "Inmediata"
            }
        ],
        "skills": [
            {
                "_id": "sk366",
                "description": "Pentaho"
            }
        ]
}

Все результаты различны.

Я сократил время с 550 мс до 43 мс на языке программирования, сравнивая выполнение с запросом к базе данных и программированием кода с использованием коллекций.

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

Если я правильно понимаю ваши требования, то это может сработать.

db.CollectionName.aggregate([   
{"$group" : {_id : {statusid:"$results.status._id", statusname:  "$results.status.name", instid:"$results.test.profession.institution._id", instname: "$results.test.profession.institution.name"}},
},
{ "$project": { 
    "results.status._id": 1, 
    "results.status.name": 1, 
    "results.test.profession.institution._id": 1,
       "results.test.profession.institution.name": 1
    }
},
{ "$sort": { "_id.statusid": 1 }},    
 ])

Примечание: данные JSON должны быть отформатированы, чтобы это работало.

...