将 SetFields 与 MongoDB C# 驱动程序 2.0 一起使用
Using SetFields with MongoDB C# driver 2.0
使用旧驱动程序,我可以指定我想要从查询中 return 的字段,如下所示:
var cursor = Collection.Find(query).
SetFields(Fields<MealPlan>.Exclude (plan => plan.Meals));
如何使用 2.0 驱动程序完成此操作?
您需要在 IFindFluent
上使用 Projection
方法(即 Find
和 Projection
return):
var findFluent = Collection.Find(query).Projection(Fields<MealPlan>.Exclude (plan => plan.Meals))
现在,这最终会生成 BsonDocument
s 的光标,因为它不知道投影的外观。您可以调用泛型 Projection
来添加该类型:
var findFluent = Collection.Find(query).Projection<MealPlan>(Fields<MealPlan>.Exclude (plan => plan.Meals))
在更一般的意义上(使用 Exclude
时不太相关),您还可以使用 lambda 表达式指定字段:
var findFluent = Collection.Find(query).Projection(plan => plan.Meals)
如果你想恢复 SetFields,你可以编写自己的扩展方法:
public static class MongoExtensions
{
public static IFindFluent<T, T> SetFields<T>(this IFindFluent<T, T> query, params string[] fields)
{
if ( fields == null || fields.Length == 0 )
{
return query;
}
var project = Builders<T>.Projection.IncludeAll<T>(fields);
return query.Project<T>(project);
}
public static ProjectionDefinition<T> IncludeAll<T>(this ProjectionDefinitionBuilder<T> projection,
params string[] fields)
{
ProjectionDefinition<T> project = null;
foreach (string columnName in fields)
{
if (project == null)
{
project = Builders<T>.Projection.Include(columnName);
}
else
{
project = project.Include(columnName);
}
}
return project;
}
}
使用旧驱动程序,我可以指定我想要从查询中 return 的字段,如下所示:
var cursor = Collection.Find(query).
SetFields(Fields<MealPlan>.Exclude (plan => plan.Meals));
如何使用 2.0 驱动程序完成此操作?
您需要在 IFindFluent
上使用 Projection
方法(即 Find
和 Projection
return):
var findFluent = Collection.Find(query).Projection(Fields<MealPlan>.Exclude (plan => plan.Meals))
现在,这最终会生成 BsonDocument
s 的光标,因为它不知道投影的外观。您可以调用泛型 Projection
来添加该类型:
var findFluent = Collection.Find(query).Projection<MealPlan>(Fields<MealPlan>.Exclude (plan => plan.Meals))
在更一般的意义上(使用 Exclude
时不太相关),您还可以使用 lambda 表达式指定字段:
var findFluent = Collection.Find(query).Projection(plan => plan.Meals)
如果你想恢复 SetFields,你可以编写自己的扩展方法:
public static class MongoExtensions
{
public static IFindFluent<T, T> SetFields<T>(this IFindFluent<T, T> query, params string[] fields)
{
if ( fields == null || fields.Length == 0 )
{
return query;
}
var project = Builders<T>.Projection.IncludeAll<T>(fields);
return query.Project<T>(project);
}
public static ProjectionDefinition<T> IncludeAll<T>(this ProjectionDefinitionBuilder<T> projection,
params string[] fields)
{
ProjectionDefinition<T> project = null;
foreach (string columnName in fields)
{
if (project == null)
{
project = Builders<T>.Projection.Include(columnName);
}
else
{
project = project.Include(columnName);
}
}
return project;
}
}