companys.drop_indexes()

def query_with_index():
    """对array like的关键字tags进行查询
    """
    st = time.clock()
    ppt(list(companys.find({"tags": {"$all": [1,2,3]}}))) 
    print("query WITH index cost %.4f seconds." % (time.clock() - st,) )

def create_invalid_index():
    """尝试添加违反规则的multikey index, 执行这个之前请先执行drop_index。
    """
    companys.create_index([("tags", pymongo.ASCENDING), ("city", pymongo.ASCENDING)])
    
def inser_invalid_document():
    companys.insert({"tags": [1,2,3], "city": [1,2,3]})

if __name__ == "__main__":
#     companys.drop()
    initialize_collection()
    drop_index()
#     query_without_index()
#     create_index()
#     query_with_index()

    create_invalid_index() # 创建多重索引
    inser_invalid_document() # pymongo.errors.WriteError: cannot index parallel arrays [city] [tags]

#     ppt(list(companys.list_indexes())) # 打印所有索引信息
    client.close()
    st = time.clock()
    doc = items.find_one({"item_id": 5})
    print("find_one(item_id = 5), elapse %.4f seconds" % (time.clock() - st, ))

    st = time.clock()
    doc = items.find({"item_id": 500 * 1000})
    print("find(item_id = 500,000), elapse %.4f seconds" %
          (time.clock() - st, ))

    st = time.clock()
    doc = items.find_one({"item_id": 500 * 1000})
    print("find_one(item_id = 500,000), elapse %.4f seconds" %
          (time.clock() - st, ))


if __name__ == "__main__":
    """本例子先生成一个1000,000条数据的collections, 然后分别查找位于前面和中间位置的数据。可以看出
    在没有索引的情况下, 如果用find方法, 会扫描整个表。而用find_one方法, 则查找中间位置的数据会慢
    很多。而一旦有了索引, 无论是用find还是find_one方法, 无论是数据的位置如何, 速度都非常快。
    
    你可以用drop_index()函数删除索引, 重新进行演示
    """
    initialize_collection()
    find_method_example()
    find_one_method_example()
    create_index()
    query_with_index()
    #     drop_index()
    client.close()