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

Mappage de propriété insensible à la casse

Pour ce faire, je pense que vous aurez 2 options.

La première serait d'écrire une carte de classe manuellement

BsonClassMap.RegisterClassMap<MyClass>(cm => {
    cm.AutoMap();
    cm.GetMemberMap(c => c.Foo).SetElementName("foo");
});

La seconde serait de décorer votre classe avec les attributs suivants

public class MyObj
{
    [BsonElement("id")]
    public int Id { get; set; }
    
    [BsonElement("foo")]
    public string Foo { get; set; }
}

L'équipe de pilotes CSharp a un bon tutoriel sur la sérialisation sur le lien suivant

http://docs.mongodb.org/ ecosystem/tutorial/serialize-documents-with-the-csharp-driver/

Mettre à jour

Je viens d'essayer ce qui suit et cela fonctionne pour moi, évidemment, je suis sûr qu'il s'agit d'une version beaucoup plus simplifiée de votre code, mais en essayant de deviner à quoi cela pourrait ressembler.

J'ai enregistré les deux cartes de classe séparément et ajouté le BsonKnownType à la classe de base.

[BsonKnownTypes(typeof(GeoJSONObject))]
public class Point
{
    public string Coordinates { get; set; }
}

public class GeoJSONObject : Point
{
    public string Type { get; set; }
}

static void Main(string[] args)
{
    var cn = new MongoConnectionStringBuilder("server=localhost;database=MyTestDB;");
    var settings = MongoClientSettings.FromConnectionStringBuilder(cn);
    var client = new MongoClient(settings);

    BsonClassMap.RegisterClassMap<Point>(cm =>
    {
        cm.AutoMap();
        cm.GetMemberMap(c => c.Coordinates).SetElementName("coordinates");                   
    });

    BsonClassMap.RegisterClassMap<GeoJSONObject>(cm =>
    {
        cm.AutoMap();
        cm.GetMemberMap(c => c.Type).SetElementName("type");
    });

    var result = client.GetServer()
              .GetDatabase("MyTestDB")
              .GetCollection("MyCol")
              .Find(Query.EQ("type", BsonValue.Create("xxxx")));
}