首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MongoDB aggregate中的$$ROOT是什么?它是如何工作的?

MongoDB aggregate中的$$ROOT是什么?它是如何工作的?
EN

Stack Overflow用户
提问于 2020-05-15 02:03:15
回答 2查看 8K关注 0票数 6

我正在看一个教程,我可以理解这个聚合是如何工作的,pings$$ROOT在其中的用途是什么。

代码语言:javascript
运行
复制
client = pymongo.MongoClient(MY_URL)
pings = client['mflix']['watching_pings']
cursor = pings.aggregate([
  {
    "$sample": { "size": 50000 }
  },
  {
    "$addFields": { 
      "dayOfWeek": { "$dayOfWeek": "$ts" },
      "hourOfDay": { "$hour": "$ts" }
    }
  },
  {
    "$group": { "_id": "$dayOfWeek", "pings": { "$push": "$$ROOT" } }
  },
  {
    "$sort": { "_id": 1 }
  }
]);
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-16 15:15:53

让我们假设我们的集合如下所示:

代码语言:javascript
运行
复制
{
    "_id" : ObjectId("b9"),
    "key" : 1,
    "value" : 20,
    "history" : ISODate("2020-05-16T00:00:00Z")
},
{
    "_id" : ObjectId("ba"),
    "key" : 1,
    "value" : 10,
    "history" : ISODate("2020-05-13T00:00:00Z")
},
{
    "_id" : ObjectId("bb"),
    "key" : 3,
    "value" : 50,
    "history" : ISODate("2020-05-12T00:00:00Z")
},
{
    "_id" : ObjectId("bc"),
    "key" : 2,
    "value" : 0,
    "history" : ISODate("2020-05-13T00:00:00Z")
},
{
    "_id" : ObjectId("bd"),
    "key" : 2,
    "value" : 10,
    "history" : ISODate("2020-05-16T00:00:00Z")
}

现在,基于要分组的history字段,将整个文档插入到一个数组字段'items‘中。这里的$$ROOT变量会很有帮助。

因此,实现上述功能的聚合查询将是:

代码语言:javascript
运行
复制
db.collection.aggregate([{
    $group: {
        _id: '$history',
        items: {$push: '$$ROOT'}
    }
}])

它将导致以下输出:

代码语言:javascript
运行
复制
{
    "_id" : ISODate("2020-05-12T00:00:00Z"),
    "items" : [
        {
            "_id" : ObjectId("bb"),
            "key" : 3,
            "value" : 50,
            "history" : ISODate("2020-05-12T00:00:00Z")
        }
    ]
},
{
    "_id" : ISODate("2020-05-13T00:00:00Z"),
    "items" : [
        {
            "_id" : ObjectId("ba"),
            "key" : 1,
            "value" : 10,
            "history" : ISODate("2020-05-13T00:00:00Z")
        },
        {
            "_id" : ObjectId("bc"),
            "key" : 2,
            "value" : 0,
            "history" : ISODate("2020-05-13T00:00:00Z")
        }
    ]
},
{
    "_id" : ISODate("2020-05-16T00:00:00Z"),
    "items" : [
        {
            "_id" : ObjectId("b9"),
            "key" : 1,
            "value" : 20,
            "history" : ISODate("2020-05-16T00:00:00Z")
        },
        {
            "_id" : ObjectId("bd"),
            "key" : 2,
            "value" : 10,
            "history" : ISODate("2020-05-16T00:00:00Z")
        }
    ]
}

我希望它能帮上忙。

票数 18
EN

Stack Overflow用户

回答已采纳

发布于 2020-05-16 15:15:53

$$ROOT是一个变量,它包含组的源文档

票数 18
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61804268

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档