【问题标题】:Mongo $group with $projectMongo $group 和 $project
【发布时间】:2016-02-03 12:07:31
【问题描述】:

我正在尝试获取关键字计数以及 parentIdcategioryIdllcId。 我的数据库是

{
    "_id" : ObjectId("5673f5b1e4b0822f6f0a5b89"),
    "keyword" : "electronic content management system",
    "llcId" : "CL1K9B",
    "categoryId" : "CL1K8V",
    "parentId" : "CL1K8V",

}

我试过$project$group

db.keyword.aggregate([
    {
        $group: {
            _id: "$llcId",
            total: {$sum: 1},
        }
    },
    {
        $project: {
            categoryId: 1, total: 1
        }
    }
])

它给了我这样的结果

{ "_id" : "CL1KJQ", "total" : 17 }
{ "_id" : "CL1KKW", "total" : 30 }

但我还需要结果中的实际数据,例如llcIdcategoryIdkeywordtotal。我尝试使用$project 显示cetgoryId 和关键字,但它只显示_id 和总数。我错过了什么?

【问题讨论】:

  • 你能写一个你需要的示例输出吗
  • 您的聚合管道将返回每个 llcId 值的文档数。这就是你想要的吗?

标签: mongodb aggregation-framework


【解决方案1】:

要获取keyword 计数,您需要按keyword 字段对文档进行分组,然后使用累加器运算符$sum 来获取文档计数。至于其他字段值,由于您按关键字值对所有文档进行分组,因此获取其他字段的最佳方法是使用 $first 运算符,该运算符从第一个返回值每个组的文档。否则,您可能必须使用 $push 运算符来返回每个组的字段值数组:

var pipeline = [
    {
        "$group": {
            "_id": "$keyword",
            "total": { "$sum": 1 },
            "llcId": { "$first": "$llcId"},
            "categoryId": { "$first": "$categoryId"},
            "parentId": { "$first": "$parentId"}
        }
    }
];

db.keyword.aggregate(pipeline)

【讨论】:

  • 如何使用 angularjs ng-repeat 显示 $push 运算符数据
  • 好的,但是如果它不是第一个呢?例如,当使用 $min 而不是 Sum 时,“$llcId”可以与不代表该文档最小值的“categoryId”配对。
【解决方案2】:

您按llcId 分组,因此每个llcId 将提供多个categoryId。 如果您希望 categoryId 在您的结果中,您必须在您的组查询中写下它。例如:

db.keyword.aggregate([
{
    $group: {
        _id: "$llcId",
        total: {$sum: 1},
        categoryId:{$max:"$categoryId"}
    }

},
{
    $project: {
        categoryId: 1, total: 1
    }
}])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-07
    • 2015-11-18
    • 2021-01-02
    • 2020-04-03
    相关资源
    最近更新 更多