net - mongodb c# update
Creando la clave Ășnica de MongoDB con C# (3)
Soy un total de n00b con MongoDB y estoy luchando para crear un campo de EmailAddress
único. Ya he visto en foros que tengo que crear un índice, pero hasta ahora no funcionó para mí. ¿Alguien tiene un ejemplo de código? ¿Tengo que crear el índice en cada guardado / llamada, o es suficiente crearlo solo una vez?
Probé este código:
DB.GetCollection<User>(Dbname)
.EnsureIndex(new IndexKeysBuilder()
.Ascending("EmailAddress"), IndexOptions.SetUnique(true));
DB.GetCollection<User>(Dbname).Save(user, SafeMode.True);
Mi modelo de User
ve así:
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; }
}
Asegúrese de que Indice () está obsoleto / obsoleto según la especificación de la versión 2.0 de C # mongo drivers: http://api.mongodb.org/csharp/current/html/M_MongoDB_Driver_MongoCollection_EnsureIndex_2.htm
Heres cómo hacerlo asíncrono y vía código 2.0:
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);
El índice único solo debe crearse una vez, después de lo cual fallarán todas las inserciones de documentos que contengan una dirección de correo electrónico duplicada. Aquí hay un ejemplo:
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);
}
Tu código se ve bien. Aquí hay un programa completo para que compares con:
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
}
}
}
También puede usar el shell mongo para confirmar que se creó el índice:
> 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
}
]
>