不区分大小写的属性映射

Kyl*_*yle 1 mongodb mongodb-.net-driver

将 MongoDB 文档序列化为 POCO 时,有没有办法使属性映射不区分大小写?例如我想要这个文件:

{
    "id": "1"
    "foo": "bar"
}
Run Code Online (Sandbox Code Playgroud)

映射到这个类:

public MyObj
{
    public int Id {get; set;}
    public string Foo {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

SCB*_*SCB 7

为此,我认为您将有 2 个选择。

第一种是手动写出类映射

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

第二个是用以下属性装饰你的类

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

CSharp 驱动程序团队在以下链接上有一个很好的序列化教程

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

更新

我刚刚尝试了以下方法,这对我有用,显然我确定这是您代码的更简化版本,但要猜测它的外观。

我分别注册了两个类映射,并将 BsonKnownType 添加到基类中。

[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")));
}
Run Code Online (Sandbox Code Playgroud)


小智 7

我发现这是一个老问题,但人们仍然可能会搜索它。至少我在问同样的问题时找到了它。

可以CamelCaseElementNameConvention用来在全球范围内应用它。

var pack = new ConventionPack();
pack.Add(new CamelCaseElementNameConvention());

ConventionRegistry.Register("Camel case convention", pack, t => true);
Run Code Online (Sandbox Code Playgroud)

文档:https://mongodb.github.io/mongo-csharp-driver/2.14/reference/bson/mapping/conventions/