Mongo DB C#驱动程序:如何为新文档重用现有过滤器

本文关键字:文档 过滤器 新文档 驱动程序 DB Mongo | 更新日期: 2023-09-27 18:29:42

我有一个现有的文档调用栏,我为它构建了服务器过滤器,如下所示:

Builders<Bar>.Filter.Eq(x=>x.SomeString,"aaaa");
Builders<Bar>.Filter.Eq(x=>x.SomeInt,5343);

Foo,Bar的定义是:

  public class Foo
    {
        public string TestString { get; set; }
        public int TestInt{get;set;}
        public Bar Bar { get; set; }
    }
    public class Bar
    {
        public string SomeString { get; set; }
        public int SomeInt { get; set; }
    }

我想在Bar成为Foo的子公司时重新使用这些过滤器。假设我有Foo文档:

Foo foo = new Foo(){ 
TestString = "FooString",
Bar = new Bar(){SomeString = "BarString"}
                   }

如何通过过滤器搜索foo:

Builders<Foo>.Filter.Eq(x=>x.Testring,"FooString") & Builders<Bar>.Filter.Eq(x=>x.SomeString,"BarString")//reuse the existing filter

MongoDb C#驱动程序中是否有可用的api?

Mongo DB C#驱动程序:如何为新文档重用现有过滤器

1)通常FooBar对象的集合将被分离,就像GridFS处理fs.filesfs.chunks以及一对多关系一样。假设它们位于同一个名为foobar:的数据库中

var collectionFoo = _database.GetCollection<Foo>("foobar");
var collectionBar = _database.GetCollection<Bar>("foobar");
var f = Builders<Foo>.Filter;
var b = Builders<Bar>.Filter;
var filterFoo = f.Eq(x => x.TestString, "FooString") & f.Eq(x => x.Bar.SomeString, "BarString");
var filterBar = b.Eq(x => x.SomeString, "BarString");

无重用,Bar作为Foo的依赖对象访问。您正在使用FilterDefinition{of Foo}的OR。

2) 同时含有CCD_ 6和CCD_。设计不好,imho。使用BsonDocument进行查询。以下是编写过滤器的方式:var subDocBarfilter = Builders<BsonDocument>.Filter.Eq("Bar.SomeString", "BarString");而不是:CCD_ 10您不能重用,嵌入式字段的访问方式与主字段不同。请参阅嵌入式文档中的字段查询C#驱动程序Mongo-docs。

3) 为Foo和Bar发明一些常见的基本类型。这将使您能够合并FilterDefinition<Foo>FilterDefinition<Bar>并使用某种工厂。例如,abstract class IHaveId { public int id {get; set;} }Foo : IHaveIdBar : IHaveId

string GetSomeStringFromBarFactory(IHaveId x) { 
    string s = ""; 
    if (x is Bar) s= (x as Bar).SomeString; 
    else if (x is Foo) s= (x as Foo).Bar.SomeString; 
    return s;
}

然后,您将不得不管理FuncExpression的转换,从Func<IHaveId, string>Expression<Func<IHaveId, string>>没有简单/可取的任务

Expression<Func<IHaveId, string>> expr = ConvertFunc2Expression (GetSomeStringFromBarFactory);
Builders<IHaveId>.Filter.Eq (expr, "BarString");

总之,我认为MongoC#驱动程序(2.0版)的当前架构不允许或不建议这样的抽象。