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?
1)通常Foo
和Bar
对象的集合将被分离,就像GridFS处理fs.files
和fs.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 : IHaveId
和Bar : 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;
}
然后,您将不得不管理Func
到Expression
的转换,从Func<IHaveId, string>
到Expression<Func<IHaveId, string>>
,没有简单/可取的任务。
Expression<Func<IHaveId, string>> expr = ConvertFunc2Expression (GetSomeStringFromBarFactory);
Builders<IHaveId>.Filter.Eq (expr, "BarString");
总之,我认为MongoC#驱动程序(2.0版)的当前架构不允许或不建议这样的抽象。