2011-06-02 10 views
22

私はMongoDBと合計n00bです。私はユニークなフィールドEmailAddressを作成するために戦っています。私は既にフォーラムでインデックスを作成しなければならないと見てきましたが、これまでのところ私にとってはうまくいかなかったのです。誰かがコード例を持っていますか?すべてのセーブ/コールでインデックスを作成する必要がありますか、それとも一度作成するだけで十分ですか?C#でMongoDBユニークキーを作成

私はこのコードを試してみました:

DB.GetCollection<User>(Dbname) 
    .EnsureIndex(new IndexKeysBuilder() 
     .Ascending("EmailAddress"), IndexOptions.SetUnique(true)); 

DB.GetCollection<User>(Dbname).Save(user, SafeMode.True); 

マイUserモデルは次のようになります。

public class User 
{ 
    [Required(ErrorMessage = "Email Required")] 
    public string EmailAddress { get; set; } 

    public ObjectId Id { get; set; } 

    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 
+0

れますあなたはドライバを使用していますか? – atbebtg

答えて

8

あなたのコードが右に見えます。あなたがと比較するためにここでは、完全な実行中のプログラムがあります:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using MongoDB.Bson; 
using MongoDB.Driver; 
using MongoDB.Driver.Builders; 

namespace TestEnsureIndexOnEmailAddress { 
    public class User { 
     public ObjectId Id; 
     public string FirstName; 
     public string LastName; 
     public string EmailAddress; 
    } 

    public static class Program { 
     public static void Main(string[] args) { 
      var server = MongoServer.Create("mongodb://localhost/?safe=true"); 
      var database = server["test"]; 
      var users = database.GetCollection<User>("users"); 
      if (users.Exists()) { users.Drop(); } 

      users.EnsureIndex(IndexKeys.Ascending("EmailAddress"), IndexOptions.SetUnique(true)); 
      var john = new User { FirstName = "John", LastName = "Smith", EmailAddress = "[email protected]" }; 
      users.Insert(john); 
      var joe = new User { FirstName = "Joe", LastName = "Smith", EmailAddress = "[email protected]" }; 
      users.Insert(joe); // should throw exception 
     } 
    } 
} 

また、インデックスが作成されてしまったことを確認するためのmongoシェルを使用することができます。

> db.users.getIndexes() 
[ 
     { 
       "name" : "_id_", 
       "ns" : "test.users", 
       "key" : { 
         "_id" : 1 
       }, 
       "v" : 0 
     }, 
     { 
       "_id" : ObjectId("4de8152ee447ad2550e3b5fd"), 
       "name" : "EmailAddress_1", 
       "ns" : "test.users", 
       "key" : { 
         "EmailAddress" : 1 
       }, 
       "unique" : true, 
       "v" : 0 
     } 
] 
> 
+0

それはうまく動作しますが、私は重複を減らすために2つ以上のフィールドにしたいです。私に提案する –

27

ユニークインデックスは一度だけ作成する必要があり、その後、重複した電子メールアドレスを含む文書挿入は失敗します。 )

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

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

users.EnsureIndex(new IndexKeysBuilder() 
    .Ascending("EmailAddress"), IndexOptions.SetUnique(true)); 

var user1 = new User { EmailAddress = "[email protected]" }; 
var user2 = new User { EmailAddress = "[email protected]" }; 

try 
{ 
    users.Save(user1, WriteConcern.Acknowledged); 
    users.Save(user2, WriteConcern.Acknowledged); // <-- throws MongoSafeModeException 
} 
catch (MongoSafeModeException ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
14

EnsureIndex(C#のMongoのドライババージョンごと/ 2.0仕様廃止廃止され:ここで例です非同期および2.0コードを介してそれを行うために相続人方法http://api.mongodb.org/csharp/current/html/M_MongoDB_Driver_MongoCollection_EnsureIndex_2.htm

を:

var mongoClient = new MongoClient("connection"); 
var db = mongoClient.GetDatabase("database"); 

var options = new CreateIndexOptions() { Unique = true }; 
var field = new StringFieldDefinition<User>("EmailAddress"); 
var indexDefinition = new IndexKeysDefinitionBuilder<User>().Ascending(field); 
await db.GetCollection<Users>("users").Indexes.CreateOneAsync(indexDefinition, options); 
関連する問題