Python3, MongoDB Вставить, только если документ не существует - PullRequest
1 голос
/ 23 марта 2020

В настоящее время у меня есть словарь с данными, извлекаемыми из API, в котором я назначил каждой точке данных собственную переменную (job_id, jobtitle, company et c.):

output = {
        'ID': job_id, 
        'Title': jobtitle, 
        'Employer' : company, 
        'Employment type' : emptype, 
        'Fulltime' : tid, 
        'Deadline' : deadline, 
        'Link' : webpage
}

, которую я хочу добавить в мою базу данных достаточно просто:

db.jobs.insert_one(output)

, но это все для l oop, который создаст 30-я sh уникальные новые документы с именами, названиями, ссылками и еще чем-то еще этот сценарий будет запускаться более одного раза, поэтому я хотел бы только вставить «выходные данные» в качестве документа, если он еще не существует в базе данных, все эти новые документы имеют свои собственные уникальные Идентификатор приходит из переменной job_id . Могу ли я проверить это?

Ответы [ 2 ]

0 голосов
/ 23 марта 2020

РЕДАКТИРОВАТЬ:

заменить

db.jobs.insert_one(output)

на

db.jobs.replace_one({'ID': job_id}, output, upsert=True)

ОРИГИНАЛЬНЫЙ ОТВЕТ на работающем примере:

Используйте replace_one() с upsert=True. Вы можете запустить это несколько раз, и он будет вставлен, если ID не найден, или замените, если он найден. Это было не совсем то, о чем вы просили, поскольку данные всегда обновляются (поэтому новые данные будут перезаписывать любые существующие данные).

from pymongo import MongoClient


db = MongoClient()['mydatabase']

for i in range(30):
    db.employer.replace_one({'ID': i},
    {
            'ID': i,
            'Title': 'jobtitle',
            'Employer' : 'company',
            'Employment type' : 'emptype',
            'Fulltime' : 'tid',
            'Deadline' : 'deadline',
            'Link' : 'webpage'
    }, upsert=True)

# Should always print 30 regardless of number of times run.
print(db.employer.count_documents({}))
0 голосов
/ 23 марта 2020

Вам нужно попробовать две вещи:

1) Выполнение .find(), и если для данного job_id документа не найдено, то запись в БД - это двусторонний вызов - вместо вас может иметь поле unique-index в job_id, которое будет выдавать ошибку, если ваша операция попытается вставить дублирующийся документ (Наличие уникального индекса намного более безопасный способ избежать дубликатов, даже полезный, если ваш код логи c не удалось).

2) Если у вас 30 диктов - вам не нужно повторяться 30 раз и использовать insert_one для 30 вызовов базы данных, вместо этого вы можете использовать insert_many который принимает массив dict's & write to database.

Примечание: По умолчанию все dict записываются в том порядке, в котором они находятся в массиве, в случае, если dict терпит неудачу, вызывает с ошибкой дублирования, то insert_many завершается с ошибкой без вставки остальных остальных, поэтому для преодоления этого необходимо передать параметр ordered=False, таким образом будут вставлены все словари, кроме дубликатов.

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