首页 > 解决方案 > mongodb 的 $facet 返回完整排序的文档而不是基于匹配的计数

问题描述

我有如下文件

{
    _id:1234,
    userId:90oi,
    tag:"self"
},
{
    _id:5678,
    userId:65yd,
    tag:"other"
},
{
    _id:9012,
    userId:78hy,
    tag:"something"
},
{
    _id:3456,
    userId:60oy,
    tag:"self"
},

我需要像下面这样的回应

[{

tag : "self",
count : 2
},
{
tag : "something",
count : 1
},
{
tag : "other",
count : 1
}
]

我正在使用 $facet 来查询文档。但它返回的是整个文件而不是计数。我的查询如下

db.data.aggregate({
    $facet: {
        categorizedByGrade : [
            { $match: {userId:ObjectId(userId)}},
            {$sortByCount: "$tag"}
        ]
    }
})

让我知道我做错了什么。在此先感谢您的帮助

标签: mongodbmongodb-queryaggregation-framework

解决方案


因此,当您确实需要在一个聚合查询( mongoDB $facet$facet )中处理多个聚合管道时,您不需要使用这一方面,请尝试以下操作:

db.yourCollectionName.aggregate([{$project :{tag :1, _id :0}},{$group :{_id: '$tag',
count: { $sum: 1 }}}, {$project : {tag : '$_id', _id:0, count :1}}])

解释 :

$project首先是在所有文档中只保留需要的字段,$group这样我们要处理的数据更少$sumset, finally$project再次用于使结果看起来像我们需要的那样。


推荐阅读