在 Mongo DB 中分组和计数

安阮

我有很多这样的推文对象:

{
    "_id" : ObjectId("5a2f4a381cb29b482553e2c9"),
    "user_id" : 21898942,
    "created_at" : ISODate("2009-03-09T19:48:50Z"),
    "id" : 1301923516,
    "place" : "",
    "retweet_count" : 0,
    "tweet" : "Save the Date! March 28th Vietnamese Cooking Class! Call to Reserve 312.255.0088",
    "favorite_count" : 0
    "type": A
}

我正在使用此代码按日期和类型对推文进行分组:

pipeline = [
    {
        "$group": {
            "_id": {
                "date": {
                    "$dateToString": {
                        "format": "%Y-%m-%d", 
                        "date": "$created_at"
                    }
                }, 
                "type": "$type"
            }, 
            "count": {
                "$sum": 1
            }
        }
    }
]
results = mongo.db.tweets.aggregate(pipeline)

这是我得到的结果:

{
    "_id": {
        "date": "2009-03-17",
        "type": A
    },
    "count": 4
,
{
    "_id": {
        "date": "2009-03-17",
        "type": B
    },
    "count": 6
}

但现在我想得到这种格式的结果:

{date: "2009-03-17", A: 4, B: 6, C: 9}

无论如何我可以aggregate直接实现这一目标吗?

注意:我使用的是 MongoDB 和 PyMongo

s7vr

您可以在 3.6 版本中尝试以下聚合查询。

添加了第二组以创建类型和计数值对的数组,然后$mergeObjects将日期键值与 合并$arrayToObject,这会产生创建类型值键和计数值对,以生成预期的响应。

$replaceRoot 将文档提升到最高级别。

pipeline = [
  {
    "$group": {
      "_id": {
        "date": {
          "$dateToString": {
            "format": "%Y-%m-%d",
            "date": "$created_at"
          }
        },
        "type": "$type"
      },
      "count": {
        "$sum": 1
      }
    }
  },
  {
    "$group": {
      "_id": "$_id.date",
      "typeandcount": {
        "$push": {
          "k": "$_id.type",
          "v": "$count"
        }
      }
    }
  },
  {
    "$replaceRoot": {
      "newRoot": {
        "$mergeObjects": [
          {
            "date": "$_id"
          },
          {
            "$arrayToObject": "$typeandcount"
          }
        ]
      }
    }
  }
]

Mongo 3.4 版本:

用下面替换最后一个阶段

{
  "$replaceRoot": {
    "newRoot": {
      "$arrayToObject": {
        "$concatArrays": [
          [
            {
              "k": "date",
              "v": "$_id"
            }
          ],
          "$typeandcount"
        ]
      }
    }
  }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章