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