質問はユースケースを完全に説明していないので、いくつかの仮定に基づいて探索するためのいくつかの潜在的なオプションを考え出しました。特に、それらは利用可能なLINQに依存し、一度に1つのドキュメントを対象としています(そして、おそらく実際に必要な数より多くのコードは必要ないでしょう):
1)あなたが持っているもののバリエーション。標準のfind
を使用する 射影とLINQ式を使用します。
var projection = Builders<ShapeDocument>.Projection
.Expression(x => x.fooArray.Where(y => y.plot == "circle"));
var items1 = collection
.Find(x => x.user == "Jone Doe")
.Project(projection)
.ToList();
2)集計パイプラインを使用します(上記と同じプロジェクションを使用できます)
var pipeline = collection
.Aggregate()
.Match(x => x.user == "Jone Doe")
.Project(i => new
{
x = i.fooArray.Where(x => x.plot == "circle")
});
var items2 = pipeline.SingleOrDefault();
3)すべての配列要素を含むドキュメントをプルバックし、LINQを使用してローカルでフィルタリングします。プラス面として、これは少量の読み取り可能なコードですが、フィルタリングする前にドキュメント全体を元に戻します。正確な用途によっては、これで問題ない場合があります。
var items3 = collection.AsQueryable()
.SingleOrDefault(x => x.user == "Jone Doe")
.fooArray.Where(x => x.plot == "circle");
LINQの場合本当に オプションではない場合は、例がありますここ これは、投影をLINQではなく変換する方法を示しています。完全にテストされていませんが、次のようなものになります:
var filter = new BsonDocument {
{"input", "$items"},
{"as", "item" },
{"cond", new BsonDocument {
// Fill in the condition values
{ "", new BsonArray { "", xxx } } }
}
};
var project = new BsonDocument {
{ "items", new BsonDocument { { "$filter", filter} } }
};
var pipeline = collection.Aggregate().Project(project);