mongodb - 汇总返回特定字段

标签 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 字段.现在我正在这样做(not 在输出中返回 Link 字段):

db.coll.aggregate([

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

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

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

以上返回only Name 字段和计数。但是如何在聚合查询的输出中也返回相应的 Link 字段(可以是多个)?

最好的问候

最佳答案

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' --> 'year' 的拼写错误

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

您需要添加 $push 或 $addToSet 来维护分组中的 $Link 值。 $addToSet 将仅允许数组中的唯一值,而 $push 将添加所有值,因此请自行决定使用哪个值。

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

关于mongodb - 汇总返回特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39412691/

相关文章:

python - 如果 Mongo 中两个日期之间存在任何数据,则返回 true 或 false

node.js - 没有模型或模式的 Mongoose

php - 使用 pecl 在 OS X El Capitan (v10.11.1) 上安装 Mongodb 驱动程序

node.js - 使用 switch case 更新集合中的多个文档

mongodb - 仅检索 MongoDB 集合中对象数组中的查询元素

MongoDB $geoIntersects 不返回特定城市的任何数据

node.js - Mongodb 按两个字段之一排序

mongodb - 使用 MongoDB 的 map/reduce 到 "group by"两个字段

MongoDB嵌套查询使用聚合函数

java - MongoDB 聚合结果作为嵌套 Json