Pymongo OperationFailure: индекс с именем: timestamp_1 уже существует с различными параметрами - PullRequest
0 голосов
/ 15 октября 2018

Я сталкивался с этой проблемой, когда пытался выполнить очистку кода.Я определил класс MongoCache для кэширования html-страниц:

class MongoCache:
    def __init__(self, client=None, expires=timedelta(days=30)):
        self.client = MongoClient('localhost', 27017) if client is None else client
        self.db = self.client.cache
        self.db.webpage.create_index('timestamp1', expireAfterSeconds=expires.total_seconds())

при создании объекта:

cache = MongoCache()

вышла информация об ошибке.

Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "F:\pythoncode\webscraping\mongo_cache.py", line 20, in __init__
  File "D:\python27\lib\site-packages\pymongo\collection.py", line 1958, in create_index
self.__create_index(keys, kwargs, session, **cmd_options)
  File "D:\python27\lib\site-packages\pymongo\collection.py", line 1860, in __create_index
session=session)
  File "D:\python27\lib\site-packages\pymongo\collection.py", line 244, in _command
retryable_write=retryable_write)
  File "D:\python27\lib\site-packages\pymongo\pool.py", line 579, in command
unacknowledged=unacknowledged)
  File "D:\python27\lib\site-packages\pymongo\network.py", line 150, in command
parse_write_concern_error=parse_write_concern_error)
  File "D:\python27\lib\site-packages\pymongo\helpers.py", line 155, in _check_command_response
  raise OperationFailure(msg % errmsg, code, response)
  OperationFailure: Index with name: timestamp_1 already exists with different options

Я попробовал некоторые решения из stackoverflow, но они не для pymongo, и я даже не могу использовать метод drop_index ().Я использовал win10, python2.7 на pycharm, а версия сервера MongoDB - 4.0.3.Я потратил два дня, чтобы выяснить проблему, и сдался ..

1 Ответ

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

Теперь я снова попробовал вопрос и обнаружил, что проблема может быть в метке времени, используемой для индекса.Я определяю объект без входного параметра, все в порядке.

cache = MongoCache()

, но, используя временную метку, он возвращается снова:

cache = MongoCache(expires=timedelta())

Функция сохранения значения для URL-адреса:

def __setitem__(self, url, result):
    record = {
        'result': Binary(zlib.compress(pickle.dumps(result))), 
        'timestamp': datetime.utcnow()}
    self.db.webpage.update({'_id': url}, {'$set': record}, upsert=True)
...