在Mongo DB中分组和计数

时间:2017-12-12 15:55:50

标签: mongodb mongodb-query pymongo

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

{
    "_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

1 个答案:

答案 0 :(得分:0)

您可以在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"
        ]
      }
    }
  }
}