ドキュメントとして保存されている次のオブジェクト構造について考えてみます。
public class Foo
{
public string Id { get; set; }
public ICollection<FooBar> Bars { get; set; }
// ...
}
public class FooBar
{
public string BarId { get; set; }
// ...
}
ドライバーでLINQスタイルのクエリを使用すると、次のようにFind
Foo
を含むすべてのFooBar
をBarId
できます。
var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync();
FilterDefinitionBuilder
のインラインLINQの代わりに Find
を使用して、これと同じクエリを実行するにはどうすればよいですか?
実行する必要のあるクエリは、$elemMatch
クエリ演算子を使用します。
したがって、ラムダ式を使用したこのクエリ
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"));