प्रश्न उपयोग के मामले का पूरी तरह से वर्णन नहीं करता है, इसलिए मैं कुछ संभावित विकल्पों के साथ आपके लिए कुछ मान्यताओं के आधार पर पता लगाने के लिए आया हूं, विशेष रूप से वे LINQ के उपलब्ध होने और एक समय में एक दस्तावेज़ को लक्षित करने पर निर्भर करते हैं ( और यह कि आप शायद अपनी ज़रूरत से ज़्यादा कोड नहीं चाहते हैं):
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);