MongoDB 聚合中的 $$ROOT 是什么以及它是如何工作的?

Sai*_*der 5 mongodb pymongo aggregation-framework

我看教程,我可以理解这种聚合是如何工作的,有什么用pings$$ROOT在里面。

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 }
  }
]);
Run Code Online (Sandbox Code Playgroud)

ngS*_*.py 13

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

{
    "_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")
}
Run Code Online (Sandbox Code Playgroud)

现在根据history您要分组的字段并将整个文档插入到数组字段“items”中。这里$$ROOT变量会有所帮助。

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

{
    "_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")
}
Run Code Online (Sandbox Code Playgroud)

它将导致以下输出:

{
    "_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")
        }
    ]
}
Run Code Online (Sandbox Code Playgroud)

我希望它有帮助。