MongoDB聚合和按ID分组,然后是日期

时间:2015-09-28 10:10:38

标签: python mongodb aggregation-framework

我的audit_records个收藏品如下:

{u'policy_holder': u'Kapil', u'_id': ObjectId('4d663451d1e7242c4b68e000'),  u'audit_time': datetime.datetime(2015, 9, 6, 10, 5, 12, 474000), u'policy_ids':    [u'92b7bbfa-688e9e5304d5'], u'category': u'TIManagement'}
{u'policy_holder': u'Sunil', u'_id': ObjectId('4d6634514cb5cb2c4b69e000'),  u'audit_time': datetime.datetime(2015, 9, 6, 11, 5, 12, 474000), u'policy_ids': [u'92b7bbfa-688e9e5304d5'], u'category': u'PIManagement'}
{u'policy_holder': u'Edward', u'_id': ObjectId('4d6634514cb5cb2c4b65e000'),  u'audit_time': datetime.datetime(2015, 8, 3, 12, 4, 2, 723000), u'policy_ids': [u'92b7ccge-688e9e5304d5'], u'category': u'TIManagement'}

我使用聚合和管道查询我的数据库,按policy_ids分组,而policy_holder没有与policy_ids相关联的startdate = datetime.datetime.strptime("2015-01-06",'%Y-%m-%d') enddate = datetime.datetime.strptime("2015-10-01",'%Y-%m-%d') pipe = [{'$match':{"audit_time": {"$gt": startdate,"$lte": enddate}}},{'$group': {'_id': '$policy_ids', 'policy_holder': {'$sum': 1}}}] for data in db.audit_records.aggregate(pipeline=pipe): 我的代码如下:

{u'policy_holder': 2, u'_id': u'92b7bbfa-688e9e5304d5'}
{u'policy_holder': 1, u'_id': u'92b7ccge-688e9e5304d5'}

Out got:

@Secured
@Priority(Priorities.AUTHENTICATION)
public class SecurityRequestFilter implements ContainerRequestFilter {

    @Context
    private ResourceInfo resourceInfo;

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {

        Method method = resourceInfo.getResourceMethod();

        if (method != null) {
            Secured secured = method.getAnnotation(Secured.class);
            ...
        }
    }
}

现在想按日期对整个输出进行分组,是否可能以及如何进行?

1 个答案:

答案 0 :(得分:0)

你必须使用$ unwind with group

的聚合管道
db.collection.aggregate([{$unwind:"$policy_ids"},{$group:{_id:{policy_id:"$policy_ids",audit_time:"$audit_time"},sum:{$sum:1}}}])
  

我在文档中修改了一下

     

像这样插入文件

{'policy_holder': 'Kapil', '_id': ObjectId('4d663451d1e7242c4b68e000'),  'audit_time': new Date(2015, 9, 6, 10, 5, 12, 474000), 'policy_ids':    ['92b7bbfa-688e9e5304d5'], 'category': 'TIManagement'}
{'policy_holder': 'Sunil', '_id': ObjectId('4d6634514cb5cb2c4b69e000'),  'audit_time': new Date(2015, 9, 6, 11, 5, 12, 474000), 'policy_ids': ['92b7bbfa-688e9e5304d5'], 'category': 'PIManagement'}
{'policy_holder': 'Edward', '_id': ObjectId('4d6634514cb5cb2c4b65e000'),  'audit_time': new Date(2015, 8, 3, 12, 4, 2, 723000), 'policy_ids': ['92b7ccge-688e9e5304d5'], 'category': 'TIManagement'}
  

更新聚合查询

db.policy.aggregate([{$unwind:"$policy_ids"},{$group:{_id:{"policy":"$policy_ids",day: { $dayOfYear: "$audit_time"}, year: { $year: "$audit_time" }},total:{$sum:1}}}])

**

  

输出

**

{“_ id”:{“policy”:“92b7ccge-688e9e5304d5”,“day”:246,“year”:2015},“total”:1}

{“_ id”:{“policy”:“92b7bbfa-688e9e5304d5”,“day”:279,“year”:2015},“total”:2}

希望这是你期待的