我的问题涉及到mongodb和pymongo;我有一个包含多个集合的数据库。每个集合中有数千个文档,但大多数只包含大约10-200个“唯一”文档。我想要计算每个“唯一”文档在特定集合中出现的次数。我见过带有特定字段值的COUNTIFS示例,但没有计算整个文档。
我已经阅读了相当多关于聚合的内容,但我仍然不知道我是否在正确的轨道上;我希望得到一些指导。
假设集合中总共有20个文档,但只有3个是唯一的。我想输出类似下面这样的COUNTIF值。
{ "_id" : ObjectId("5cde2f68416437c1ae98de18"), "Source Network Address LP" : [ "192.168.5.5" ], "Account Name" : [ " -", " ANONYMOUS LOGON" ], "Process Name LP" : [ "-" ] } - 10
{ "_id" : ObjectId("5cde2f68416437c1ae98de19"), "Source Network Address LP" : [ "192.168.5.8" ], "Account Name" : [ " -", " ANONYMOUS LOGON" ], "Process Name LP" : [ "-" ] } - 6
{ "_id" : ObjectId("5cde2f68416437c1ae98de19"), "Source Network Address LP" : [ "192.168.5.2" ], "Account Name" : [ " -", " ANONYMOUS LOGON" ], "Process Name LP" : [ "-" ] } - 4最后,我将以以下格式将此输出写入CSV文件:
Source Network Address,Account Name,Process Name LP,count
'192.168.5.5','-|ANONYMOUS LOGON','-',10
'192.168.5.8','-|ANONYMOUS LOGON','-',6
'192.168.5.2','-|ANONYMOUS LOGON','-',4发布于 2019-05-18 12:19:53
我确实想出了一个问题的解决方案,但没有使用pymongo进行过滤/计数。相反,我只是简单地迭代了db.collection.find()输出,并使用了带有python-box (https://pypi.org/project/python-box/)的collections.Counter()。在普通的内置Python字典中使用collections.Counter()是不可能的,因为字典是不可散列的。但是,您可以使用冻结的python-box Box()对象创建一个哈希字典,然后使用collections.Counter()进行计数。
在开始计算时,我确实遇到了一个小问题,因为即使文档几乎完全相同,由于_id字段的唯一性,它们也永远不会完全相同。
for doc in db.collections.find():
dict_record = dict(doc)
del(dict_doc['_id'])
# Box object makes dict object hashable so we can count
b = Box(dict_doc, frozen_box=True)
stacked[b] += 1如果有人想出一个纯粹使用pymongo进行过滤和计数的解决方案,请让我知道;我很好奇。
https://stackoverflow.com/questions/56179598
复制相似问题