Pertanyaannya tidak sepenuhnya menggambarkan kasus penggunaan jadi saya telah menemukan beberapa opsi potensial untuk Anda jelajahi berdasarkan beberapa asumsi, khususnya mereka bergantung pada LINQ yang tersedia dan untuk menargetkan satu dokumen pada satu waktu ( dan Anda mungkin tidak menginginkan lebih banyak kode daripada yang sebenarnya Anda butuhkan):
1) Variasi pada apa yang Anda miliki. Gunakan find
standar dengan proyeksi dan ekspresi 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) Gunakan jalur agregasi (Anda bisa menggunakan proyeksi yang sama seperti di atas)
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) Tarik dokumen kembali dengan semua elemen array kemudian filter secara lokal menggunakan LINQ. Di sisi positifnya, ini adalah sejumlah kecil kode yang dapat dibaca, namun, ini mengembalikan seluruh dokumen sebelum memfilter. Tergantung pada penggunaan yang tepat Anda, ini mungkin dapat diterima.
var items3 = collection.AsQueryable()
.SingleOrDefault(x => x.user == "Jone Doe")
.fooArray.Where(x => x.plot == "circle");
Jika LINQ benar-benar bukan pilihan maka ada contoh di sini yang menunjukkan bagaimana Anda dapat mengubah proyeksi menjadi bukan kami LINQ. Benar-benar belum teruji tetapi akan menjadi sesuatu di sepanjang baris:
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);