2015-09-28 63 views
0

audit_records集合是如下:MongoDB的聚集和組的ID及日期

{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_ids 和相關policy_holder我的代碼如下:

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'} 

現在想按日期分組這個整個輸出,這是可能的和如何?

+0

你想按日期分組? –

+0

是的,先按policy_id分組,然後按日期分組。 基本上我想要的是在給定的日期列出沒有策略ID,以及策略ID的policy_holder的數量。如何通過日期實現這個 –

+0

如何?日期是每個文檔上的單獨項目,因此在第一個分組過程中挑選哪一個項目?第一?持續?的最小值?最大?然後按日期分組是什麼?大概是「一天」? –

回答

-1

你必須使用與$聚合管道與組放鬆

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」:{ 「政策」:「92b7ccge- 688e9e5304d5「,」day「:246,」year「:2015},」total「:1}

{ 「_id」:{ 「政策」: 「92b7bbfa-688e9e5304d5」, 「天」:279, 「年」:2015年}, 「總」:2}

希望這是你期待

+0

它不會給我這樣的列表: 日期policy_ids Policy_holder count 2015-09,06 92b7bbfa-688e9e5304d5 2 –

+0

它給出的輸出是什麼?你可以把它粘貼在這裏嗎? –

+0

這裏是輸出 {u'sum':1,u'_id':{u'audit_time':datetime。datetime(2015,9,6,10,5,12,474000),u'policy_ids':u'92b7bbfa-688e9e5304d5'}} {u'sum':1,u'_id':{u'audit_time' :datetime.datetime(2015,9,22,5,3,7,724000),u'policy_ids':u'92b7bbfa-688e9e5304d5'}} {u'sum':1,u'_id':{u 'audit_time':datetime.datetime(2015,8,3,12,4,2,723000),u'policy_ids':u'92b7ccge-688e9e5304d5'}} –