web-dev-qa-db-ja.com

MongoDB C#ドライバーを使用して、ネストされた配列でフィルタービルダーを使用してクエリを実行する

ドキュメントとして保存されている次のオブジェクト構造について考えてみます。

public class Foo
{
    public string Id { get; set; }
    public ICollection<FooBar> Bars { get; set; }

    // ...
}

public class FooBar
{
    public string BarId { get; set; }

    // ...
}

ドライバーでLINQスタイルのクエリを使用すると、次のようにFindFooを含むすべてのFooBarBarIdできます。

var foos = await m_fooCollection.Find( f => f.Bars.Any( fb => fb.BarId == "123") ).ToListAsync();

FilterDefinitionBuilderのインラインLINQの代わりに Find を使用して、これと同じクエリを実行するにはどうすればよいですか?

8
kspearrin

実行する必要のあるクエリは、$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"));
15
i3arnon