Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python pymong群与计数_Python_Mongodb_Pymongo - Fatal编程技术网

Python pymong群与计数

Python pymong群与计数,python,mongodb,pymongo,Python,Mongodb,Pymongo,假设我有一个集合,其中包含一些日志条目50^6,为了提取一些统计信息,我希望将其缩写为提示 下面是我收藏的一个文档的示例。我刚刚留下了相关信息 { 'prg': 'blastall', 'uid': '7225', 'version': '2.2.21', 'date': datetime.datetime(2013, 12, 1, 0, 0), '_id': ObjectId('54948dbdff4346034c23ae8d'), 'pack': 'blast'

假设我有一个集合,其中包含一些日志条目50^6,为了提取一些统计信息,我希望将其缩写为提示

下面是我收藏的一个文档的示例。我刚刚留下了相关信息

{
  'prg': 'blastall', 
  'uid': '7225',
  'version': '2.2.21',
  'date': datetime.datetime(2013, 12, 1, 0, 0),
  '_id': ObjectId('54948dbdff4346034c23ae8d'), 
  'pack': 'blast'
}
注意,不同的prg可能属于一个包

我想为给定的两个包/版本提取以下信息。 收藏中的眼睛数量 使用此程序包/版本的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查询级别完成此操作

您完全可以聚合结果,但不完全按照预期的格式,如下所示:

progs': [{'blastall': 1000}, {'formatdb': 200}, {'megablast':12}]
但非常接近,这肯定是有用的,很容易检索

获取包组合的唯一程序数 和版本、组、包装、版本和prg上的记录。 每组中的$sum运算符将给出每个唯一组的计数 prg。保留对每个prg记录列表的参考。 现在,根据rec字段展开分组记录。 项目prg_详细信息作为包含prg名称的对象,以及 它对每一条记录都很重要。 仅按包和版本将未缠绕的记录分组 属性,并将用户和程序项累积为唯一列表。 修改代码:

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"}}}])
订单样本:

{
        "_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"
        ]
}