假设我有一个带有一些日志条目(50 ^ 6)的集合,我希望能够提示以提取一些satistics。
这是我的收藏中的一个文档的示例。我刚离开相关信息
{
'prg': 'blastall',
'uid': '7225',
'version': '2.2.21',
'date': datetime.datetime(2013, 12, 1, 0, 0),
'_id': ObjectId('54948dbdff4346034c23ae8d'),
'pack': 'blast'
}
请注意,各种prg可能属于一个包
我希望能够为以下信息提取给定的一对包/版本。 nb of ocuurences in the collection 使用此软件包/版本的uid列表 使用的编程列表
目前我这样做。
satrt,end是限制处理期间间隔的日期时间。
pack_ag = col.aggregate([
{'$match': {"date": {'$gte':start, '$lt': end}}},
{'$project' : {'pack':1, 'version':1, 'prg':1, 'uid':1}},
{'$group' :{"_id":{"pack":"$pack", "version":"$version"}, 'hits': {'$sum': 1}, 'progs': { '$addToSet': "$prg"}, 'users': {'$addToSet': '$uid'}}}])
它给了我预期的东西; - )
{
'progs': ['blastall', 'formatdb', 'megablast'],
'hits': 1212,
'_id': {'version': '2.2.21', 'pack': 'blast'},
'users': ['7225', '1234', '9876]
}
我想要的是在progs列表中存储程序使用的信息。 例如:
progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}]
我必须承认,我不知道如何以循环结果的其他方式执行任务,查找并计算与pack / version / prg匹配的文档,然后更新文档。
有没有办法在momgo查询级别填写此内容?
答案 0 :(得分:0)
您绝对可以汇总结果,而不是完全按预期格式汇总:
progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}]
但非常接近肯定会有用且易于检索的内容。
programs
组合的唯一pack
计数
和version
,group
,pack
,version
和prg
上的记录。
每个组中的$sum
运算符将给出每个唯一的计数
prg
。保留对每个prg
的记录列表的引用。rec
字段展开分组记录。prg_detail
项目作为保存prg
和的名称的对象
每个记录的计数。pack
和version
组合回未展开的记录
属性,并将用户和prog项目累积为唯一列表。修改后的代码:
col.aggregate([
{$match: {"date": {$gte:start, $lt: end}}},
{$group:{"_id":{"pack":"$pack","version":"$version","prg":"$prg"},
"count":{$sum:1},"rec":{$push:"$$ROOT"}}},
{$unwind:"$rec"},
{$project:{"pack":"$_id.pack","version":"$_id.version",
"prg_detail":{"name":"$_id.prg","count":"$count"},"rec":1}},
{$group:{"_id":{"pack":"$pack",
"version":"$version"},
"progs":{$addToSet:"$prg_detail"},
"hits":{$sum:1},
"users":{$addToSet:"$rec.uid"}}}])
样本o / p:
{
"_id" : {
"pack" : "blast",
"version" : "2.2.21"
},
"progs" : [
{
"name" : "blastall",
"count" : 1
},
{
"name" : "formatDB",
"count" : 2
},
{
"name" : "megaBlast",
"count" : 1
}
],
"hits" : 4,
"users" : [
"7225",
"7229",
"7226",
"7227"
]
}