0

我是 MongoDB 的初学者。我需要从一个 MongoDB 查询中获取各个列的计数。

例如,我有一个hotelCollection带有 fields的集合cityid , starRating, area, locality。现在我将参数传递给查询cityid123我需要获取结果:

result: {
    starCount: {
        1star: 5,
        2star: 6,
        3star: 5
    },
    areaCount: {
        area1: 4,
        area2: 12
    },
    localityCount: {
        locality1: 10,
        locality2: 6
    }
}

我尝试使用aggregate查询,但最后我只得到一列计数。所以我暂时写了4个aggregate查询。现在我面临性能问题。我做了很多谷歌搜索,但找不到任何解决方案。请帮我解决这个问题。

4

1 回答 1

0

您的运算符中需要一个条件表达式,该表达式$sum将使用比较运算符检查cityid , starRating, area, locality键的值$eq

您可以通过添加此表达式来重组管道,如下所示:

db.hotelCollection.aggregate([
    { "$match": { "cityid": 123 } },
    {
        "$group" : {
            "_id": null, 
            "1star": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$starRating", 1]  },
                        1, 0
                    ]
                }
            },
            "2star": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$starRating", 2]  },
                        1, 0
                    ]
                }
            },
            "3star": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$starRating", 3]  },
                        1, 0
                    ]
                }
            },
            "area1": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$area", 1]  },
                        1, 0
                    ]
                }
            },
            "area2": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$area", 2]  },
                        1, 0
                    ]
                }
            },
            "locality1": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$locality", 1]  },
                        1, 0
                    ]
                }
            },
            "locality2": {
                "$sum": {
                    "$cond": [
                        { "$eq": ["$locality", 2]  },
                        1, 0
                    ]
                }
            }
        }
    },
    { 
        "$project" : { 
            "_id": 0,
            "starCount": {
                "1Star": "$1star",
                "2Star": "$2star",
                "3Star": "$3star"
            },
            "areaCount": {
                "area1": "$area1",
                "area2": "$area2"
            },
            "localityCount": {
                "locality1": "$locality1",
                "locality2": "$locality2"
            }               
        } 
    }
])
于 2016-08-09T14:36:38.643 回答