【问题标题】:COUNTIF function for documents in mongodb collectionMongoDB 集合中文档的 COUNTIF 函数
【发布时间】:2019-10-04 09:12:38
【问题描述】:

我的问题涉及到mongodb和pymongo;我有一个包含多个集合的数据库。每个集合中都有数千个文档,但大多数只包含大约 10-200 个“独特”文档。我想 COUNTIF 每个“唯一”文档在特定集合中出现多少次。我见过具有特定字段值但不计算整个文档的 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

【问题讨论】:

    标签: mongodb mapreduce pymongo aggregation


    【解决方案1】:

    我确实想出了解决问题的方法,但没有使用 pymongo 过滤/计数。相反,我只是迭代了 db.collection.find() 输出并将 collections.Counter() 与 python-box (https://pypi.org/project/python-box/) 一起使用。不可能将 collections.Counter() 与普通的内置 Python dict 一起使用,因为字典不可散列。但是,您可以使用冻结的 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 进行过滤和计数的解决方案,请告诉我;我很好奇。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-15
      • 2012-07-04
      • 1970-01-01
      相关资源
      最近更新 更多