c# - MongoDB .NET - 按名称获取 IMongoCollection
问题描述
我正在从MongoDB.Driver.Legacy
API 中重构一些遗留代码。
我有以下方法,它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>
解决方案
如果你为类设置了一个鉴别器(自定义集合名称),你可以使用这个:
[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)
推荐阅读
- python - 来自迭代器的随机项?
- angular - Angular 双向绑定 [(ngModel)]
- r - 将带有月份缩写的字符串转换为 POSIXlt 的问题
- ios - 成功登录后导航未激活
- list - 哈斯克尔。查找列表中出现频率最高的数字,如果其中有几个,则返回其中的最大值
- c# - Unity - 粒子效果:如何使着色器在所需的时间播放
- java - 检索 ByteBuddy 生成的 Spring Bean 的问题
- python - 当我从命令行运行命令时,python doctest 没有运行测试
- python - 有没有办法在 Numpy 中实现更新的伪随机数生成器
- node.js - Angular 上的 POST 请求无法使用 mySql