net conexion cadena c# mongodb

c# - conexion - mongodb net core



¿Cómo convertir un documento BsonDocument en un objeto fuertemente tipado con el controlador oficial MongoDB C#? (4)

Para propósitos de prueba de unidad, me gustaría probar mis asignaciones de clase sin leer y escribir documentos en la base de datos de MongoDB. Para manejar casos especiales, como referencias circulares de padre / hijo y propiedades de solo lectura, he usado BsoncClassMap.RegisterClassMap< MyType>(...) con algunas asignaciones personalizadas que reemplazan el AutoMap(); predeterminado AutoMap(); Mapeos generados.

¿Alguien sabe cómo convertir un documento BsonDocument en el objeto fuertemente tipeado deseado sin hacer un viaje de ida y vuelta a la base de datos? El controlador está haciendo esto cuando va y viene del almacén de datos. Mi objetivo sería usar la misma lógica que el controlador C # de MongoDB usa internamente para probar la serialización a / desde un objeto de dominio C # en un documento BsonDocument.

¿Puedo usar el método de extensión de ToBsonDocument() para convertir un objeto C # en un BsonDocument? La pieza que me falta es el proceso inverso: esencialmente un BsonDocument.ToObject< MyType>(); .

¿Es esto posible con la última versión del controlador oficial de MongoDB C #? Parece que debería ser. Me pregunto si estoy ciego y me estoy perdiendo lo obvio.


El controlador MongoDB proporciona un método para deserializar de Bson a su tipo. El BsonSerializer se puede encontrar en MongoDB.Bson.dll , en el espacio de nombres de MongoDB.Bson.Serialization .

Puede usar el BsonSerializer.Deserialize<T>() . Algún código de ejemplo sería

var obj = new MyClass { MyVersion = new Version(1,0,0,0) }; var bsonObject = obj.ToBsonDocument(); var myObj = BsonSerializer.Deserialize<MyClass>(bsonObject); Console.WriteLine(myObj);

Donde MyClass se define como

public class MyClass { public Version MyVersion {get; set;} }

Espero que esto ayude.


En caso de que necesite una parte del objeto, por ejemplo: Tiene entidad Maestro:

public class Teacher { public string Mail {get; set;} public IEnumerable<Course> Courses {get; set;} public string Name {get; set;} }

Y entidad de curso:

public class Course { public int CurseCode {get; set;} public string CourseName {get; set;} }

Y solo necesita "Cursos" de la entidad "Profesor", puede usar:

var db = conection.GetDatabase("school"); var collection = db.GetCollection<Teacher>("teachers"); // Or your collection Name string mailForSearch="[email protected]"; // param for search in linq var allCoursesBson = collection.Find(x => x.Mail == mailForSearch).Project(Builders<Teacher>.Projection.Include(x => x.Courses).Exclude("_Id")).ToList(); // allCoursesBson is BsonDocument list, then use a first BsonDocument an convert to string for convert to IEnumerable<Courses> type with BsonSerializer.Deserialize string allCoursesText = resp.FirstOrDefault()[0].ToString(); IEnumerable<Courses> allCourses = BsonSerializer.Deserialize<IEnumerable<Courses>>(allCoursesText);

Ahora, tiene una lista de cursos de taecher y convierte la respuesta de BsonDocument en "IEnumerable".


Una forma directa si desea asignar filas extraídas de mongoDB a una clase dentro de su código es la siguiente:

//Connect and Query from MongoDB var db = client.GetDatabase("blog"); var col = db.GetCollection<BsonDocument>("users"); var result = await col.Find(new BsonDocument("Email",model.Email)).ToListAsync(); //read first row from the result var user1 = result[0]; result[0] would be say "{ "_id" : ObjectId("569c05da09f251fb0ee33f5f"), "Name" : "fKfKWCc", "Email" : "[email protected]" }" // a user class with name and email User user = new User(); // assign User.Name = user1[1].ToString(); // user1[1] is "fKfKWCc" User.Email = user1[2].ToString(); // user1[2] is "[email protected]"


Utilice la palabra clave de yield para devolver los datos que desee.

public IEnumerable<string> GetMongoFields(string collectionName) { var connectionString = ConfigurationManager.ConnectionStrings[DbConfig.GetMongoDb()].ConnectionString; var databaseName = MongoUrl.Create(connectionString).DatabaseName; MongoClient client = new MongoClient(connectionString); var server = client.GetServer(); var db = server.GetDatabase(databaseName); var collection = db.GetCollection<BsonDocument>(collectionName); var list = collection.FindAll().ToList(); yield return list.ToJson(); }