返回汇总

时间:2016-09-09 13:28:15

标签: mongodb mongodb-query aggregation-framework

我正在尝试汇总以下数据:

{
    "_id" : ObjectId("527a6b7c24a8874c078b9d10"),
    "Name" : "FirstName",
    "Link" : "www.mylink.com/123",
    "year" : 2013
}
{
    "_id" : ObjectId("527a6b7c24a8874c078b9d11"),
    "Name" : "FirstName",
    "Link" : "www.mylink.com/124",
    "year" : 2013
}
{
    "_id" : ObjectId("527a6b7c24a8874c078b9d12"),
    "Name" : "SecondName",
    "Link" : "www.mylink.com/125",
    "year" : 2013
}

我想汇总Name字段的出现次数,但想要在聚合查询的输出中返回相应的Link字段。现在我这样做(返回输出中的Link字段):

db.coll.aggregate([

    { "$match": { "Year": 2013 } },

    { "$group": {
        "_id": {
            "Name": "$Name"
        },
        "count": { "$sum": 1 }
    }},
    { "$project": {
        "_id": "$_id",
        "count": 1
    }},

    { $sort: {
        count: 1
    } }
])

以上只返回 Name字段和计数。但是我怎样才能在聚合查询的输出中返回相应的Link字段(可能是几个)?

最好的问候

1 个答案:

答案 0 :(得分:7)

db.coll.aggregate([
    { "$match": { "year": 2013 } },
    { "$group": {"_id": "$Name", "Link": {$push: "$Link"}, "count": { "$sum": 1 }}},
    { "$project": {"Name": "$_id", _id: 0, "Link": 1, "count": 1}},
    { $sort: {count: 1} }
])

结果:

{ "Link" : [ "www.mylink.com/125" ], "count" : 1, "Name" : "SecondName" }

{ "Link" : [ "www.mylink.com/123", "www.mylink.com/124" ], "count" : 2, "Name" : "FirstName" }

好的,所以$ match是正确的,除了'Year'的拼写错误 - > '年'

$ group可以简化一点。我删除了一组额外的括号,以便您获得id:'FirstName'而不是id:{'name':'FirstName'},因为我们可以在$ project阶段将_id重塑为'name'。

您需要添加$ push或$ addToSet来维护分组中的$ Link值。 $ addToSet仅允许数组中的唯一值,而$ push将添加所有值,因此请根据您的意愿使用。

$ project和$ sort很简单,重命名并包含/排除您想要的任何字段。