Ответ 1
В этом случае theres BulkWriteError, который должен предоставить подробную информацию о том, что было сделано https://api.mongodb.com/python/current/examples/bulk.html#ordered-bulk-write-operations
Но в случае потери соединения AutoReconnect отправляется вместо этого, и информация о ходе работы выглядит потерянной (проверена на pymongo == 3.5.1)
В любом случае вам нужно будет восстановить то, что было написано, а что нет, и повторить операцию для остальных элементов. В последнем случае это будет немного сложнее, поскольку у вас нет предварительной информации о том, что было написано, но все же выполнимо
В качестве решения эскиза: каждому документу, который нужно вставить, присваивается ObjectId, если _id уже не присутствует. Вы можете справиться с этим сами - перебирайте документы, вручную назначьте _id для тех, кто его отсутствует, и сохраните идентификаторы во временной переменной. После того, как вы нажмете на исключение, найдите последний _id успешно вставленный рычаг, т.е. Двоичный поисковый подход, чтобы иметь в худшем случае запросы O (logN) и, возможно, также использовать факт, что массовые операции разбиваются на более мелкие партии (https://api.mongodb.com/python/current/examples/bulk.html#bulk-insert). Но, конечно, применимость этого подхода зависит от профиля нагрузки, который у вас есть на ваших экземплярах mongod, и допускаются ли дополнительные запросы всплесков. Если BulkWriteError были выбраны так, как ожидалось, вы можете просто захватить документы, которые не вставлены, и повторить операцию только для этих документов.
Вернемся к проблеме AutoReconnect, я лично открыл билет в трекере проблем с mongo-python-drivers, вероятность того, что он будет либо ошибкой, либо сделаем это специально