Функция COUNTIF для документов в коллекции mongodb - PullRequest
0 голосов
/ 17 мая 2019

Моя проблема связана с 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

1 Ответ

0 голосов
/ 18 мая 2019

Я нашел решение своей проблемы, но не фильтровал / подсчитывал, используя pymongo.Вместо этого я просто перебрал вывод db.collection.find () и использовал collection.Counter () с python-box (https://pypi.org/project/python-box/).). Невозможно использовать collection.Counter () с обычным встроенным в Python dictпотому что словари не могут быть хэшируемыми. Однако вы можете использовать замороженный объект Box () Python-box для создания хэшируемого дикта, а затем считать с помощью collection.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, тогда, пожалуйста,я знаю, мне любопытно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...