2017-10-03 4 views
0

j'utilisais création de la collection automatique pymongo:Comment créer une collection avec index s'il n'existe pas dans pymongo?

client = MongoClient(url) 
db = client.get_default_database() 
my_collection = db['my_collection'] 

Je pensais qu'il a créé automatiquement sur la dernière déclaration et a ajouté

index_name = 'my_index' 
if index_name not in my_collection.index_information(): 
    my_collection.create_index(..., name=index_name, unique=False) 

Malheureusement, cela a conduit à l'erreur

pymongo.errors.OperationFailure: Collection ... doesn't exist 

Cette m'a fait réfléchir, cette collection est créée lors de la première sauvegarde. Cela ne me donne aucun endroit pour mettre le code de création d'index. Donc, la question est: comment créer une collection avec index, mais seulement si elle n'existe pas?

J'ai lu cette réponse https://stackoverflow.com/a/9826294/258483 mais ne pas aimer la façon dont il implique d'écrire vérifier l'existence à deux reprises:

client = MongoClient(url) 
db = client.get_default_database() 
if 'my_collection' not in db.collection_names(): 
    db.createCollection('my_collection') 

my_collection = db['my_collection'] 
index_name = 'my_index' 
if index_name not in my_collection.index_information(): 
    my_collection.create_index(..., name=index_name, unique=False) 

Répondre

1

Comme vous le voyez, appelant index_information sur une collection qui n'existe pas encore lancers francs OperationFailure.

Il suffit d'appeler create_index sans vérifier d'abord:

client = MongoClient(url) 
db = client.get_default_database() 
my_collection = db['my_collection'] 
index_name = 'my_index' 
my_collection.create_index(..., name=index_name, unique=False) 

Si l'index existe déjà, le serveur MongoDB ignore la commande. Si l'index n'existe pas, MongoDB crée la collection (si nécessaire) et l'index sur la collection.

+0

Cela soulèvera 'OperationFailure' n'est-ce pas? – Dims

+0

Si l'index existe déjà, le serveur MongoDB ignore la commande. –

+0

le cas est que la collection peut être inexistante – Dims