Otázka plně nepopisuje případ použití, takže jsem pro vás přišel s několika potenciálními možnostmi, které můžete prozkoumat na základě několika předpokladů, zejména závisí na dostupnosti LINQ a na cílení na jeden dokument najednou ( a že pravděpodobně nechcete více kódu, než skutečně potřebujete):
1) Variace na to, co máte. Použijte standardní find
s projekcí a výrazem 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) Použijte agregační potrubí (můžete použít stejnou projekci jako výše)
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) Stáhněte dokument zpět se všemi prvky pole a poté filtrujte lokálně pomocí LINQ. Pozitivní je, že se jedná o malé množství čitelného kódu, ale vrátí celý dokument zpět před filtrováním. V závislosti na vašem přesném použití to může být přijatelné.
var items3 = collection.AsQueryable()
.SingleOrDefault(x => x.user == "Jone Doe")
.fooArray.Where(x => x.plot == "circle");
Pokud LINQ opravdu není možnost, pak je tu příklad zde to ukazuje, jak byste mohli převést projekci na ne my LINQ. Zcela netestováno, ale bylo by to něco ve smyslu:
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);