pymong group and count

时间:2014-12-23 16:18:16

标签: python mongodb pymongo

假设我有一个带有一些日志条目(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查询级别填写此内容?

1 个答案:

答案 0 :(得分:0)

您绝对可以汇总结果,而不是完全按预期格式汇总:

progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}]

但非常接近肯定会有用且易于检索的内容。

  • 获取programs组合的唯一pack计数 和versiongrouppackversionprg上的记录。 每个组中的$sum运算符将给出每个唯一的计数 prg。保留对每个prg的记录列表的引用。
  • 现在,根据rec字段展开分组记录。
  • prg_detail项目作为保存prg和的名称的对象 每个记录的计数。
  • 仅将packversion组合回未展开的记录 属性,并将用户和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"
        ]
}