2014-11-22 42 views
0

我试图建立一个查询,以返回符合该条件的所有账户的ObjectId:MongoDB:如何使用聚合框架返回objectIDs?

  1. 状态不等于-1
  2. created_at小于或等于午夜(UTC)在30天前
  3. created_at一个月中的某一天等于当天的月份

我可以做#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" 
    }} 
]) 

我知道月的某一天也许应该达到在比赛部分,需要添加到组部分返回的ObjectID东西。

我错过了什么?

+0

请问您可以发布集合中的示例文档吗? – BatScream 2014-11-22 19:33:04

回答

1

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

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

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

谢谢!有用。我不得不将''objectIds“:”1“'更改为''objectIds”:1'。 – okoboko 2014-11-22 20:23:28

+0

是的,这是一个错字。 – BatScream 2014-11-22 20:26:12