Python-Как найти дублированное имя / документ в Монго БД? - PullRequest
0 голосов
/ 16 ноября 2018

Я хочу найти дублированный документ в моем mongodb на основе имени, у меня есть следующий код:

def Check_BFA_DB(options):
    issue_list=[]
    client = MongoClient(options.host, int(options.port))
        db = client[options.db]
        collection = db[options.collection]
        names = [{'$project': {'name':'$name'}}]
        name_cursor = collection.aggregate(names, cursor={})
        for name in name_cursor:
            issue_list.append(name)
            print(name)

Он напечатает все имена, как я могу распечатать только дубликаты?

Обращаюсь за любой помощью!

1 Ответ

0 голосов
/ 16 ноября 2018

Следующий запрос покажет только дубликаты:

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()

...