Индексация нескольких полей в pymongo


Я пытаюсь применить индексацию для моей коллекции mongodb через pymongo. Я использую

db[collection_name].ensure_index([("field_name" , "text"),("unique", 1), ("dropDups" , 1)])

И это работает. Но как теперь применить его для нескольких полей? Что-то вроде этого

db[collection_name].ensure_index([("field_name1" , "text"),("field_name2", "text"),("field_name3", "text"),("unique", 1), ("dropDups" , 1)])

Я знаю, что мы можем использовать db.collection.ensureIndex({"$**":"text"},{"name":"TextIndex"}) в оболочке mongo, но я не хочу индексировать все поля. Кто-нибудь может мне помочь?

2 2

2 ответа:

>>> from pymongo import IndexModel, ASCENDING, DESCENDING
>>> index1 = IndexModel([("hello", DESCENDING),
...                      ("world", ASCENDING)], name="hello_world")

Это было упомянуто в доке для pymongo

db[collection_name].ensure_index([("field_name1" , TEXT),("field_name2", TEXT)],name="index_name"))

Это обеспечит составной индекс на [field_name1, field_name2]

Http://api.mongodb.org/python/current/api/pymongo/collection.html#pymongo.collection.Collection.create_indexes

Прямо из док createIndex:

>>> my_collection.create_index([("field_name1", TEXT),
...                             ("field_name2", TEXT),
                                unique=True,
                                dropDups=1])

Остерегайтесь этого:

dropDups не поддерживается MongoDB 2.7.5 или новее. Этот параметр автоматически игнорируется сервером, и при обнаружении повторяющегося значения построение уникального индекса с его помощью завершится ошибкой.

В любом случае, это создаст составной индекс на field_name1 и field_name2.

Наконец, обратите внимание, что существуют некоторые ограничения при использовании составных текстовых индексов.