2013-07-23 30 views
32

Tôi đã tạo lập trình một bộ sưu tập tài liệu mới bằng trình điều khiển MongoDB C#.Cách tạo chỉ mục trong MongoDB qua .NET

Tại thời điểm này, tôi muốn tạo và tạo chỉ mục theo chương trình. Làm thế nào tôi có thể làm điều đó?

+2

Bạn có thể tham khảo [documantion] (http: //api.mongodb. org/csharp/current/html/e5bf7883-8321-89e4-3993-8069a61fa8b8.htm). Có một phương thức 'MongoCollection.EnsureIndex'. – Schaliasos

+0

có thể trùng lặp của [Tạo khóa duy nhất MongoDB với C#] (http://stackoverflow.com/questions/6218966/creating-mongodb-unique-key-with-c-sharp) – WiredPrairie

Trả lời

49

Bắt đầu từ phiên bản 2.0 của trình điều khiển, có async-chỉ API mới. API cũ sẽ không còn được sử dụng vì nó là mặt tiền chặn trên API mới và không còn được dùng nữa.

Cách hiện khuyến khích để tạo ra một chỉ số là bằng cách gọi và chờ CreateOneAsync với một IndexKeysDefinition bạn nhận được bằng cách sử dụng 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

Đây là câu trả lời cập nhật, hoạt động. –

+2

Câu hỏi nhanh cho bộ sưu tập đậu phộng Tôi là một fan hâm mộ lớn của lambdas gõ mạnh mẽ trong C# trên dây ma thuật ở nơi khác, nhưng câu hỏi trở thành giả định đối tượng Hamster có một loạt các địa chỉ (thanh toán, vật lý, gửi thư, vv) và tôi cũng muốn lập chỉ mục theo mã zip. Thật không may khi bạn nhấn Builders .IndexKeys.Ascending (_ => _.Addresses.First(). ZipCode) chỉ mục tạo ra như thể mã zip nằm trên lớp con chuột gốc. Các tài liệu trên docs.mongodb.com là thưa thớt tốt nhất. – Buvy

14

Something như thế này nên làm:

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

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

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

Xin vui lòng xem các bit sau trong tài liệu:

+0

Điều này hoàn hảo – Payedimaunt

+9

Lỗi thời, xem câu trả lời I3arnon – meffect

43

bạn nên sử dụng CreateIndex như EnsureIndex được đánh dấu lỗi thời trong tương lai tương thích với các phiên bản tiếp theo của 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 Bạn có nghĩa là thả cái hiện có và xây dựng cái mới? Hoặc đơn giản là xây dựng một chỉ mục khác? Cả hai đều không xảy ra. – i3arnon

+9

Dường như tôi đã sai; nó sẽ gửi lệnh để xây dựng một chỉ mục, nhưng nếu chỉ mục đã được xây dựng, nó sẽ dẫn đến một không-op; sự hiểu lầm của tôi xuất phát từ một lỗi với việc tạo chỉ mục tiền cảnh khiến các cuộc gọi createindex khác bị chặn, khiến tôi tin rằng họ đang xây dựng lại chỉ mục. Xin lỗi tất cả, I3arnon ở ngay đây. –

+0

CreateIndex dường như được đánh dấu là lỗi thời trong mã của tôi trong khi EnsureIndex thì không. Thông tin này có chính xác không? Có vẻ như tôi không thể thay đổi được những cái đã lỗi thời trong bản cập nhật phiên bản (vì vậy tôi không thể tin rằng chỉ có chúng ta đang xem xét các phiên bản mã khác nhau). – Chris