sql >> Base de Datos >  >> NoSQL >> MongoDB

Proyectar a otro tipo usando el SDK de C#

He encontrado la forma de ejecutar el mapeo que desea:

collection
    .Find(Builders<MyType>.Filter.AnyIn(x => x.Documents, new[] { "c" }))
    .Project(Builders<MyType>.Projection.Exclude(c => c.Documents))
    .As<MySubType>()
    .ToList();

Pero primero debe registrar el mapeo para su Subtipo ignorando el elemento adicional. No lo entiendo al 100%, parece ser un error del controlador, no obtiene Documents de mongo, pero sabe que MyType tiene tal propiedad. Tenga en cuenta que debe registrar el mapeo de su clase, antes primero creas una colección de este tipo.

if (!BsonClassMap.IsClassMapRegistered(typeof(MySubType)))
{
    BsonClassMap.RegisterClassMap<MySubType>(cm =>
    {
        cm.AutoMap();
        cm.SetIgnoreExtraElements(true);
    });
}

Lo hice con datos de muestra:

var toInsert = new List<MyType>
{
    new MyType {Id = 1, Name = "bla", Documents =new List<string> {"a", "b", "v"}},
    new MyType {Id = 2, Name = "ada", Documents =new List<string> {"c", "d", "r"}},
};

Y podría obtener el resultado esperado:

collection
    .Find(Builders<MyType>.Filter.AnyIn(x => x.Documents, new[] { "c" }))
    .Project(Builders<MyType>.Projection.Exclude(c => c.Documents))
    .As<MySubType>()
    .ToList()
    .Dump();