【问题标题】:How to include existing fields in mongodb aggregation $project operation如何在 mongodb 聚合 $project 操作中包含现有字段
【发布时间】:2015-04-01 19:56:25
【问题描述】:

我有一个样本集合articles,其中包含以下数据:

/* 0 */
{
    "_id" : "post 1",
    "author" : "Bob",
    "content" : "...",
    "page_views" : 5
}

/* 1 */
{
    "_id" : "post 2",
    "author" : "Bob",
    "content" : "...",
    "page_views" : 9
}

/* 2 */
{
    "_id" : "post 3",
    "author" : "Bob",
    "content" : "...",
    "page_views" : 8
}

我想使用聚合框架来查找给定作者的页面浏览量的最小值和最大值,并在此过程中显示带有最小值/最大值的文章的 _id。这是我的预期输出:

{ _id    : "Bob", 
   value : { min : { page_views : 5 , _id : "post 1" } , 
             max : { page_views , 9 , _id : "post 3" } } }

我已经尝试过实现这个聚合管道:

db.articles.aggregate([
    {
        "$group":  {
            "_id": "$author",
            "min_page_views": {
                "$min": "$page_views"
            },
            "max_page_views": {
                "$max": "$page_views"
            }
        }            
    },
    {
        "$project": {
            "_id": 1,
            "min": {
                "page_views": "$min_page_views",
                "_id": "$_id"                
            },
            "max": {
                "page_views": "$max_page_views",
                "_id": "$_id"                
            }
        }
    }
])

输出:

/* 0 */
{
    "result" : [ 
        {
            "_id" : "Bob",
            "min" : {
                "page_views" : 5,
                "_id" : "Bob"
            },
            "max" : {
                "page_views" : 9,
                "_id" : "Bob"
            }
        }
    ],
    "ok" : 1
}

我似乎无法获得另一个字段 max._id 或 min._id,它在投影之前给出了原始文档 ID。如何更改我的聚合管道,以便我也可以包含此字段?

【问题讨论】:

    标签: mongodb


    【解决方案1】:

    您可以如下修改您的aggregate 管道:

    • 在 $group 之前添加一个 $sort 阶段 阶段操作符以升序获取记录。

    • 然后获取每个组的 $first 和 $last 记录 这将分别保存每个作者的lowest 和highest 查看页面。

    $$ROOT是一个系统变量,用于引用当前正在处理的文档的顶层元素。

    修改代码:

    db.articles.aggregate([
    {$sort:{"page_views":1}},
    {$group:{"_id":"$author",
             "max":{$last:"$$ROOT"},
             "min":{$first:"$$ROOT"}}},
    {$project:{"max.page_views":1,
               "max._id":1,
               "min.page_views":1,
               "min._id":1}}
    ])
    

    样本 o/p:

    {
            "_id" : "Bob",
            "max" : {
                    "_id" : "post 2",
                    "page_views" : 9
            },
            "min" : {
                    "_id" : "post 1",
                    "page_views" : 5
            }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多