Я собираю данные из разных источников данных, которые все нажимают на разные коллекции в MongoDB. Все источники данных имеют поле, в котором хранится имя хоста конкретной системы. Однако некоторые из них имеют только имя хоста (т.е. HOSTNAME1), в то время как другие имеют имя хоста вместе с доменным именем (например, HOSTNAME1.XXX.XXX.COM). Моя задача - получить количество уникальных имен хостов во всех источниках данных. Вполне возможно, что один источник данных может дать мне HOSTNAME1, а другой может дать мне HOSTNAME1.XXX.XXX.COM. В настоящее время я использую метод агрегации "addtoSet" для фильтрации любых повторяющихся имен хостов, которые имеют один и тот же формат. Любые предложения по учету имен хостов, которые не имеют одинакового формата и не уникальны? Решения, использующие Python 2.x, являются предпочтительными, но не требуются.
def uniqueCount (collName, uploadDate):
sysList = list(cursor.aggregate([ { '$match':{'UPLOAD_DATE':uploadDate} }, { '$group': {
'_id': collName,
'uniqueHosts': {'$addToSet': {'$toUpper':'$HOSTNAME'}}
}}]))
return len(sysList[0]['uniqueHosts'])
Вы совсем близко - просто HOSTNAME
поле HOSTNAME
. Это можно сделать полностью на стороне БД, используя $arrayElemAt
и $split
:
db.getCollection('collection').aggregate([
{$group: {
_id: ...,
// Set of HOSTNAME.split('.')[0]
uniqueHosts: {$addToSet: {$arrayElemAt: [{$split: ['$HOSTNAME', '.']}, 0]}}
}}
])