Câu hỏi không mô tả đầy đủ trường hợp sử dụng vì vậy tôi đã đưa ra một số tùy chọn tiềm năng để bạn khám phá dựa trên một số giả định, cụ thể là chúng phụ thuộc vào LINQ có sẵn và nhắm mục tiêu một tài liệu duy nhất tại một thời điểm ( và rằng bạn có thể không muốn nhiều mã hơn mức bạn thực sự cần):
1) Một biến thể về những gì bạn có. Sử dụng find
tiêu chuẩn với phép chiếu và biểu thức 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) Sử dụng đường dẫn tổng hợp (bạn có thể sử dụng cùng một phép chiếu như trên)
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) Kéo tài liệu trở lại với tất cả các phần tử mảng sau đó lọc cục bộ bằng LINQ. Về mặt tích cực, đây là một lượng nhỏ mã có thể đọc được, tuy nhiên, nó đưa toàn bộ tài liệu trở lại trước khi lọc. Tùy thuộc vào cách sử dụng chính xác của bạn, điều này có thể được chấp nhận.
var items3 = collection.AsQueryable()
.SingleOrDefault(x => x.user == "Jone Doe")
.fooArray.Where(x => x.plot == "circle");
Nếu LINQ thực sự không phải là một tùy chọn thì có một ví dụ tại đây điều đó cho thấy cách bạn có thể chuyển đổi phép chiếu không phải LINQ của chúng tôi. Hoàn toàn chưa được kiểm tra nhưng sẽ là một cái gì đó dọc theo dòng:
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);