如何在MongoDB中使用ConventionPack

时间:2018-06-21 16:38:54

标签: mongodb mongodb-.net-driver

我正在使用mongodb 3.4版。基于Documentation hereSO Post,我在这里尝试使用Convention Pack将每个属性名称设置为lowerCamelCase

输入是Json字符串,其中包含序列化对象的集合。请注意,集合中的每个对象都可以不同,并且可以具有不同的属性集。
例如,下面是包含3个混合对象的字符串。

"[{\"ToyotaProperty1\":\"Some Value\",\"ToyotaProperty2\":\"Some Value\",\"Name\":\"Toyota\"},
  {\"HondaProperty1\":\"Some Value\",\"HondaProperty2\":\"Some Value\",\"Name\":\"Honda\"},
  {\"FordProperty1\":\"Some Value\",\"FordProperty2\":\"Some Value\",\"Name\":\"Ford\"}]"

我想为每个对象在mongo集合中创建单独的文档。插入集合后,文档的属性名称应为lowerCamelCase。因此,ToyotaProperty1应该变成toyotaProperty1ToyotaProperty2应该变成toyotaProperty2,依此类推。...

public class MyRepository
{
    private readonly IMongoDatabase _mongoDatabase = null;        

    public MyRepository(IMongoDatabase mongoDatabase)
    {
        _mongoDatabase = mongoDatabase;            
    }

    public async Task Save(string str)
    {
       // register convention
        var pack = new ConventionPack();
        pack.Add(new CamelCaseElementNameConvention());
        ConventionRegistry.Register("camel case", pack, t => true);

        // get mongo collection
        var cars = _mongoDatabase.GetCollection<BsonDocument>("cars");

        // deserialize input string into collection of bsondocument
        var list = MongoDB.Bson.Serialization.BsonSerializer.Deserialize<IEnumerable<BsonDocument>>(str);
        await cars.InsertManyAsync(list).ConfigureAwait(false);
    }
}

问题
1>上面的代码按预期为每个JSON字符串对象创建了文档,但是在mongo中,文档的属性名称未变为lowerCamleCase。而不是像ToyotaProperty1一样保留它。

2>如何仅为此lowerCamleCase方法设置Save约定?第三个参数t => true使其成为全局参数。我知道我可以使用名称空间,但不确定哪个名称空间?

更新1
我发现的大多数示例都使用自定义C#类。请注意,我有BsonDocument的集合。我真的想知道Convention Pack是否甚至可以与BsonDocument

的集合一起使用

0 个答案:

没有答案