Моторный указатель не создан в пустой коллекции

У меня есть следующий код для настройки моей базы данных:

self.con = motor.MotorClient(host, port)
self.Db = self.con.DB
self.Col = self.Db.Col

self.Col.create_index("c")
self.Col.create_index("h")

Когда я бегу index_information() Я вижу только индексную информацию в поле _id. Однако, если я перееду create_index() после вставки некоторых записей index_information() показывает новые индексы. Означает ли это, что мне нужно подождать, пока у меня появятся записи в коллекции, прежде чем я смогу создавать индексы? Есть ли другой способ сделать это, так как я начинаю с пустой коллекции?

2 ответа

Решение

Вы можете создать индекс для пустой или несуществующей коллекции MongoDB, и индекс появится в index_information:

>>> from tornado import ioloop, gen
>>> import motor
>>>
>>> con = motor.MotorClient()
>>> db = con.test
>>> col = db.collection
>>>
>>>
>>> @gen.coroutine
... def coro():
...     yield db.drop_collection("collection")
...     yield col.create_index("c")
...     yield col.create_index("h")
...     print((yield col.index_information()))
...
>>> ioloop.IOLoop.current().run_sync(coro)
{u'c_1': {u'key': [(u'c', 1)], u'v': 1}, u'_id_': {u'key': [(u'_id', 1)], u'v': 1}, u'h_1': {u'key': [(u'h', 1)], u'v': 1}}

Так как я не вижу никаких выражений yield в вашем примере кода или каких-либо обратных вызовов, я подозреваю, что вы неправильно используете Motor. Мотор асинхронный; чтобы дождаться завершения любого метода Motor, который обращается к серверу базы данных, вы должны либо передать обратный вызов методу, либо выдать Future, который возвращает метод.

Для получения дополнительной информации обратитесь к учебнику:

http://motor.readthedocs.org/en/stable/tutorial.html

Обсуждение вызова асинхронных методов с помощью Motor (и это относится ко всем библиотекам Tornado, а не только к Motor) начинается с раздела "вставка документа".

Вы можете очень легко создать индекс в mongodb (даже в пустой коллекции), используяа также.

field_name: может быть любым полем, для которого вы хотите создать индекс.
direction: может быть любым из следующих значений: 1, -1, 2dsphere, textили же hashed

Подробности см. в документации MotorCollection.

В приведенном ниже коде я пытаюсь создать индекс, используя motorбиблиотека и python.

      db.collection_name.create_index([("field_name", 1)] # To create ascending index
db.collection_name.create_index([("geoloc_field_name", "2dsphere")] # To create geo index
db.collection_name.create_index([("field_name", "text")] # To create text based index
Другие вопросы по тегам