MongoDB:如何使用聚合框架返回objectIDs?

时间:2014-11-22 18:39:50

标签: python mongodb aggregation-framework

我尝试构建查询以返回符合此条件的所有帐户的ObjectId:

  1. 状态不等于-1
  2. created_at小于或等于午夜utc 30天前
  3. created_at日期等于今天的某一天
  4. 我能够做#1和#2,但我坚持#3并且还在结果中包含ObjectId。

    Account._get_collection().aggregate([
        { "$match": {
           "status": { "$ne": -1 },
           "created_at": { "$lte": datetime.datetime.utcnow().replace(hour=0, minute=0, second=0, microsecond=0) - datetime.timedelta(days=30), }
        }},
        { "$group": {
            "_id": {
                "dayOfMonth" : { "$dayOfMonth": "$created_at" },
            },
        }},
        { "$project": {
            "_id": "1"
        }}
    ])
    

    我知道月份的日期可能应该在匹配部分中,并且需要将某些内容添加到组部分以返回ObjectIds。

    我错过了什么?

1 个答案:

答案 0 :(得分:1)

修改$group$project阶段,如下所示。您需要跟踪组中所有记录的Object Ids,以便稍后进行投影。因此,在分组时,使用运算符$push来累积每个组的所有对象ID。

project阶段,只需显示它。

您的代码不正确,因为它投影的是每个组的"_id"dayOfMonth),而不是文档本身。

{ "$group": {
    "_id": {
        "dayOfMonth" : { "$dayOfMonth": "$created_at" },
    },"objectIds":{$push:"$_id"}
}},
{ "$project": {
    "objectIds": 1
}}