Следующий запрос покажет только дубликаты:
db['collection_name'].aggregate([{'$group': {'_id':'$name', 'count': {'$sum': 1}}}, {'$match': {'count': {'$gt': 1}}}])
Как это работает:
Шаг 1: Просмотрите всю коллекцию и сгруппируйте документы по свойству name
и для каждого имени подсчитайте, сколько раз оно используется в коллекции.
Шаг 2: фильтровать (используя ключевое слово match
) только те документы, в которых число больше 1 (оператор gt
).
Пример (написанный для оболочки mongo,но может быть легко адаптирован для Python):
db.a.insert({name: "name1"})
db.a.insert({name: "name1"})
db.a.insert({name: "name2"})
db.a.aggregate([{"$group": {_id:"$name", count: {"$sum": 1}}}, {$match: {count: {"$gt": 1}}}])
Результат равен { "_id" : "name1", "count" : 2 }
Таким образом, ваш код должен выглядеть примерно так:
def Check_BFA_DB(options):
issue_list=[]
client = MongoClient(options.host, int(options.port))
db = client[options.db]
name_cursor = db[options.collection].aggregate([
{'$group': {'_id': '$name', 'count': {'$sum': 1}}},
{'$match': {'count': {'$gt': 1}}}
])
for document in name_cursor:
name = document['_id']
issue_list.append(name)
print(name)
BTW (несвязан с вопросом), соглашение об именах Python для имен функций состоит из строчных букв, поэтому вы можете захотеть назвать его check_bfa_db()