【问题标题】:How to filter Bson Document on a computed field of a C# class?如何在 C# 类的计算字段上过滤 Bson 文档?
【发布时间】:2019-08-21 15:07:10
【问题描述】:

我有几个类需要存储在 MongoDb 集合中,这些类有一个公共基类和定义公共字段的公共接口。每个类都有一个名称相同但实现不同的计算字段。当我尝试查询该字段时,我收到该字段不受支持的消息

我正在使用最新的 MongoDb 驱动程序在 .Net Core 2.2 控制台应用程序上运行它

界面:

 public interface ITask
    {
        ObjectId Id { get; set; }
        TaskStatus Status { get; set; }
        DateTime Timestamp { get; set; }
        string UserId { get; set; }
        string ComputedField{ get; }
    }

基类:

public abstract class BaseTask : ITask
    {
        [BsonId(IdGenerator = typeof(ObjectIdGenerator))]
        public ObjectId Id { get; set; }
        [BsonElement("Status")]
        public TaskStatus Status { get; set; }
        [BsonElement("Timestamp")]
        public DateTime Timestamp { get; set; }
        [BsonElement("UserId")]
        public string UserId { get; set; }
        public virtual string ComputedField
        {
            get { return CalculateMD5Hash(Id.ToString()); }
        }
}

给我带来问题的实际课程

public class MyTask : BaseTask
    {

        [BsonElement("Field1")]
        public Guid Field1{ get; set; }


        [BsonElement("ComputedField")]
        public override string ComputedField
        {
            get { return CalculateMD5Hash($"ABC{Field1.ToString()}"); } 
        }

    }

调用 MongoDb 层的包装器

public class TaskService<T> : ITaskService<T> where T : ITask
    {
        private readonly IPersistanceLayer<ObjectId, object> _pl;


        public async Task<T> GetNextTask(string key)
        {
              var oee = _pl.Mongo.Filter<T>(x => x.ConcurrencyKey==key 
                , typeof(T).Name).OrderBy(x=> x.Timestamp).FirstOrDefault();
            return oee;
        }

    }

MongoDb 层

 public IEnumerable<T> Filter<T>(System.Linq.Expressions.Expression<Func<T, bool>> lambda, string collection)
        {
            var filter = Builders<T>.Filter.Where(lambda);

            return _db.GetCollection<T>(collection).Find(filter).ToList();
        }

我得到的错误是

[ERR] {document}.ComputedField is not supported.

在集合中,我看到插入它时保存的文档,但是计算字段的值被正确存储,唯一的问题是当我尝试查询该字段时

【问题讨论】:

    标签: c# mongodb linq mongodb-.net-driver bson


    【解决方案1】:

    问题是我在寻找错误的集合并转换到错误的类

    public class TaskService<T> : ITaskService<T> where T : ITask
        {
            private readonly IPersistanceLayer<ObjectId, object> _pl;
    
    
            public async Task<T> GetNextTask(string key)
            {
                  var nextTask= _pl.Mongo.Filter<T>(x => x.ConcurrencyKey==key 
                    , typeof(T).Name).OrderBy(x=> x.Timestamp).FirstOrDefault();
                return nextTask;
            }
    
        }
    

    在这个方法中,T 的类型是 BaseTask 而不是 MyTask,所以我的计算字段不存在,我已经纠正了它,现在它可以工作了

    【讨论】:

      猜你喜欢
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 2016-11-07
      • 2013-08-06
      • 1970-01-01
      相关资源
      最近更新 更多