MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Projetando para outro tipo usando o C# SDK


Eu encontrei a maneira de executar o mapeamento que você deseja:
collection
    .Find(Builders<MyType>.Filter.AnyIn(x => x.Documents, new[] { "c" }))
    .Project(Builders<MyType>.Projection.Exclude(c => c.Documents))
    .As<MySubType>()
    .ToList();

Mas primeiro você deve registrar o mapeamento para seu SubType ignorando o elemento extra. Não entendi 100%, parece ser um bug do driver, não recebe Documents do mongo, mas sabe que MyType tem tal propriedade. Observe que você deve registrar seu mapeamento de classe antes você primeiro cria uma coleção desse tipo.
if (!BsonClassMap.IsClassMapRegistered(typeof(MySubType)))
{
    BsonClassMap.RegisterClassMap<MySubType>(cm =>
    {
        cm.AutoMap();
        cm.SetIgnoreExtraElements(true);
    });
}

Eu fiz isso com dados de exemplo:
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"}},
};

E poderia obter a saída esperada:
collection
    .Find(Builders<MyType>.Filter.AnyIn(x => x.Documents, new[] { "c" }))
    .Project(Builders<MyType>.Projection.Exclude(c => c.Documents))
    .As<MySubType>()
    .ToList()
    .Dump();