2013-07-23 13 views
32

Ho creato una nuova raccolta di documenti utilizzando il driver MongoDB C#.Come creare indici in MongoDB tramite .NET

A questo punto, desidero creare e creare indici a livello di codice. Come lo posso fare?

+2

È possibile fare riferimento al [documantion] (http: //api.mongodb. org/csharp/corrente/html/e5bf7883-8321-89e4-3993-8069a61fa8b8.htm). Esiste un metodo 'MongoCollection.EnsureIndex'. – Schaliasos

+0

possibile duplicato di [Creazione di MongoDB Chiave univoca con C#] (http://stackoverflow.com/questions/6218966/creating-mongodb-unique-key-with-c-sharp) – WiredPrairie

risposta

49

A partire dalla versione 2.0 del driver, è disponibile una nuova API async -only. La vecchia API non dovrebbe più essere utilizzata in quanto è una facciata di blocco sulla nuova API ed è deprecata.

Il modo in cui attualmente raccomandato per creare un indice è chiamando e in attesa CreateOneAsync con una IndexKeysDefinition si ottiene utilizzando Builders.IndexKeys:

static async Task CreateIndex() 
{ 
    var client = new MongoClient(); 
    var database = client.GetDatabase("HamsterSchool"); 
    var collection = database.GetCollection<Hamster>("Hamsters"); 
    await collection.Indexes.CreateOneAsync(Builders<Hamster>.IndexKeys.Ascending(_ => _.Name)); 
} 
+3

Questa è la risposta più aggiornata, che funziona. –

+2

Domanda veloce per la galleria di arachidi Sono un grande fan dei lambda fortemente digitati in C# su stringhe magiche altrove, ma la domanda diventa assumendo che l'oggetto Hamster avesse una serie di indirizzi (fatturazione, fisico, mailing, ecc.) E volevo anche indice per codice postale Sfortunatamente una volta che hai colpito Builders .IndexKeys.Acending (_ => _.Addresses.First(). ZipCode) l'indice crea come se il codice postale fosse presente sul criceto della classe radice. La documentazione su docs.mongodb.com è scarna al meglio. – Buvy

14

Qualcosa del genere dovrebbe fare:

var server = MongoServer.Create("mongodb://localhost"); 
var db = server.GetDatabase("myapp"); 

var users = db.GetCollection<User>("users"); 

users.EnsureIndex(new IndexKeysBuilder().Ascending("EmailAddress")); 

prega di consultare i seguenti bit nella documentazione:

+0

Buono questo è perfetto – Payedimaunt

+9

Obsoleto, vedere risposta I3arnon – meffect

43

dovreste usare CreateIndex come EnsureIndex è contrassegnato obsoleto per il futuro compatibilità con le prossime versioni di MongoDB:

var client = new MongoClient("mongodb://localhost"); 
var db = client.GetServer().GetDatabase("db"); 
var collection = db.GetCollection<Hamster>("Hamsters"); 

collection.CreateIndex(IndexKeys<Hamster>.Ascending(_ => _.Name)); 
+1

@PhilBarresi Vuoi dire eliminare quello esistente e costruirne uno nuovo? O semplicemente costruisci un altro indice? Entrambi non accadono. – i3arnon

+9

A quanto pare ho sbagliato; invia il comando per creare un indice, ma se l'indice è già compilato risulterà in un no-op; la mia incomprensione è venuta da un errore con una creazione di indice in primo piano che ha causato il blocco di altre chiamate createindex, inducendomi a credere che stessero ricostruendo l'indice. Mi scuso tutti, I3arnon è proprio qui. –

+0

CreateIndex sembra essere contrassegnato come obsoleto nel mio codice mentre ConfirmIndex non lo è. Queste informazioni sono corrette? Mi sembra improbabile che abbiano cambiato quelli che erano stati obsoleti in un aggiornamento della versione (quindi non posso credere che stiamo guardando solo a diverse versioni del codice). – Chris