从非重复分组过滤器返回多个值-Mongodb

时间:2018-12-19 21:02:07

标签: mongodb group-by aggregation-framework aggregate

我想在一个查询中返回两种类型的分组结果,但这不起作用。

如果您有一个想法,请与我分享。

我有这个收藏集:

[
    {
        _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 :(得分:0)

如果我正确理解了您的要求,那么这可能会起作用。

pop

注意:JSON数据需要格式化才能正常工作。

答案 1 :(得分:0)

我找到了解决方法:

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

所有结果都是不同的。

与使用集合进行数据库查询和代码编程相比,我将编程语言的时间从550ms减少到了43ms。