mongodbtornado-motor

Motor Index not created on empty Collection


I have the following code to setup my database:

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

When I run index_information() I only see index information on _id field. However if I move the create_index() after some entries are inserted the index_information() shows the new indexes. Does this mean I have to wait until I have entries in the collection before I can create indexes? Is there another way to do this since I start with an empty collection?


Solution

  • You can create an index on an empty, or non-existent, MongoDB collection, and the index appears in 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}}
    

    Since I don't see any "yield" statements in your example code, or any callbacks, I suspect you're not using Motor correctly. Motor is asynchronous; in order to wait for any Motor method that talks to the database server to complete you must either pass a callback to the method, or yield the Future the method returns.

    For more information consult the tutorial:

    http://motor.readthedocs.org/en/stable/tutorial.html#inserting-a-document

    The discussion of calling asynchronous methods with Motor (and this applies to all Tornado libraries, not just Motor) begins at the "inserting a document" section.