首页 > 解决方案 > MongoDB .NET - 按名称获取 IMongoCollection

问题描述

我正在从MongoDB.Driver.LegacyAPI 中重构一些遗留代码。

我有以下方法,它MongoCollection通过字符串集合名称获取。

    protected virtual MongoCollection GetMongoCollection(Type type)
    {
        return Store.GetCollection(GetCollectionName(type));
    }

Store在此示例中是MongoDatabase来自 Legacy API。该GetCollectionName()方法在 BsonClassMap 中查找各种内容以确定集合的字符串名称:

    private string GetCollectionName(Type type)
    {
        return !IsRegisteredWithClassMap(type) ? type.Name : GetRegisteredClassMapType(type).Name;
    }

    private Type GetRegisteredClassMapType(Type objectType)
    {
        if (objectType.BaseType == null)
        {
            return null;
        }
        var isroot = BsonClassMap.LookupClassMap(objectType.BaseType).IsRootClass;
        return isroot ? objectType.BaseType : GetRegisteredClassMapType(objectType.BaseType);
    }

    private bool IsRegisteredWithClassMap(Type objectType)
    {
        var isRegistered = GetRegisteredClassMapType(objectType);
        return isRegistered != null;
    }

我将如何GetMongoCollection()使用新 API 实现该方法。来自IMongoDatabase新 API 的方法没有GetCollection()接受字符串的方法。只有一个通用版本GetCollection<T>

标签: c#.netmongodb

解决方案


如果你为类设置了一个鉴别器(自定义集合名称),你可以使用这个:

[BsonDiscriminator("CollectionName")]
public class MyModel
{ 
...
}

var client = new MongoClient("connection string");
var database = client.GetDatabase("database name");

var collection = database.GetCollection<MyModel>(BsonClassMap.LookupClassMap(typeof(MyModel)).Discriminator)

推荐阅读