使用 MongoDB C# 驱动程序在嵌套数组上使用过滤器生成器查询
Query with filter builder on nested array using MongoDB C# driver
考虑以下存储为文档的对象结构:
public class Foo
{
public string Id { get; set; }
public ICollection<FooBar> Bars { get; set; }
// ...
}
public class FooBar
{
public string BarId { get; set; }
// ...
}
对驱动程序使用 LINQ 样式查询,我可以 Find
所有包含 FooBar
BarId
的 Foo
,如下所示:
var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync();
如何使用 FilterDefinitionBuilder
而不是 Find
上的内联 LINQ 来实现相同的查询?
您需要执行的查询使用 $elemMatch
查询运算符。
所以,这个查询使用了 lambda 表达式
var findFluent = collection.Find(f => f.Bars.Any(fb => fb.BarId == "123"));
相当于这个查询使用FilterDefinitionBuilder
:
var findFluent = collection.Find(Builders<Foo>.Filter.ElemMatch(
foo => foo.Bars,
foobar => foobar.BarId == "123"));
考虑以下存储为文档的对象结构:
public class Foo
{
public string Id { get; set; }
public ICollection<FooBar> Bars { get; set; }
// ...
}
public class FooBar
{
public string BarId { get; set; }
// ...
}
对驱动程序使用 LINQ 样式查询,我可以 Find
所有包含 FooBar
BarId
的 Foo
,如下所示:
var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync();
如何使用 FilterDefinitionBuilder
而不是 Find
上的内联 LINQ 来实现相同的查询?
您需要执行的查询使用 $elemMatch
查询运算符。
所以,这个查询使用了 lambda 表达式
var findFluent = collection.Find(f => f.Bars.Any(fb => fb.BarId == "123"));
相当于这个查询使用FilterDefinitionBuilder
:
var findFluent = collection.Find(Builders<Foo>.Filter.ElemMatch(
foo => foo.Bars,
foobar => foobar.BarId == "123"));