MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Projection vers un autre type à l'aide du SDK C#

J'ai trouvé le moyen d'exécuter le mappage que vous souhaitez :

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

Mais vous devez d'abord enregistrer le mappage de votre sous-type en ignorant l'élément supplémentaire. Je ne comprends pas à 100 %, cela semble être un bogue du pilote, il n'obtient pas les Documents de mongo, mais sait que MyType possède une telle propriété. Notez que vous devez enregistrer votre mappage de classe, avant vous créez d'abord une collection de ce type.

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

Je l'ai fait avec des exemples de données :

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"}},
};

Et pourrait obtenir le résultat attendu :

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