mongodb - 如何在 mongodb 聚合 $project 操作中包含现有字段

标签 mongodb

我有一个示例集合 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._idmin._id 在投影之前给出原始文档 ID。如何更改我的聚合管道,以便我也可以包含此字段?

最佳答案

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

  • 包括 $sort您的$group 之前的舞台 阶段操作符以升序获取记录。

  • 然后获取 $first$last每组记录 这将分别保存每个作者的 lowesthighest 浏览页面。

$$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
        }
}

关于mongodb - 如何在 mongodb 聚合 $project 操作中包含现有字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29399650/

相关文章:

node.js - 是否应该在应用程序设置中调用 EnsureIndex?

mongodb - 为什么将 ElasticSearch 与 Mongodb 一起使用?

mongodb - 在同一数据库中复制集合的最快方法是什么?

mongodb - 错误 : network error while attempting to run command 'isMaster' on host '127.0.0.1:27017'

mongodb - 子进程/usr/bin/dpkg 返回错误代码 (1)

node.js - Mongodb 查找操作查询 ($gte, $lte) 不工作

search - Mongodb 中的有序搜索结果?

MongoDB 3.2.9 无法在 CentOS 上作为服务启动

mongodb - 如何将具有自定义 MarshalBSONValue 的结构的 nil 指针序列化为 BSON?

mongodb - 在新的 Meteor 应用程序开发中使用本地 MongoDB 而不是 minimongo