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();
}