【问题标题】:Using SetFields with MongoDB C# driver 2.0将 SetFields 与 MongoDB C# 驱动程序 2.0 一起使用
【发布时间】:2015-04-16 22:38:46
【问题描述】:

使用旧驱动程序,我可以指定要从查询中返回的字段,如下所示:

var cursor = Collection.Find(query).
  SetFields(Fields<MealPlan>.Exclude (plan => plan.Meals));

如何使用 2.0 驱动程序完成此操作?

【问题讨论】:

    标签: c# .net mongodb filtering mongodb-.net-driver


    【解决方案1】:

    如果您想要返回 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;
    
        }
    }
    

    【讨论】:

      【解决方案2】:

      您需要在IFindFluent 上使用Projection 方法(这是FindProjection 返回的内容):

      var findFluent = Collection.Find(query).Projection(Fields<MealPlan>.Exclude (plan => plan.Meals))
      

      现在,这最终会生成 BsonDocuments 的光标,因为它不知道投影的外观。您可以调用泛型 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)
      

      【讨论】:

      • 谢谢。我知道驱动程序处于测试阶段,但通用投影是否支持抽象类?我假设序列化程序可以访问鉴别器以确定具体类型。
      • 你到底是什么意思?
      • @Graeme 你的意思是像Collection.Find(query).Projection&lt;AbstractPlan&gt;(Fields.Include("_id"))这样的东西吗?不,它不会工作,因为它试图从AbstractPlan 创建一个实例。如果基类不是抽象的,但实例是基类而不是具体类型,它可以工作。
      • 实际上,我认为只要鉴别器存在(在投影中),它就应该起作用。它肯定会作为基类返回类型并需要向下转换,但在下面,在这种情况下,我们只是使用 AbstractPlan 序列化程序,它知道如何处理鉴别器。不过我没试过,所以...
      • @CraigWilson 刚刚做到了。添加鉴别器时它确实有效(与 _id 不同,默认情况下不会从 mongo 返回)
      猜你喜欢
      • 2018-01-13
      • 1970-01-01
      • 2021-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多