आमतौर पर आपको नेस्टेड सरणी को फ़िल्टर करने के लिए एग्रीगेशन फ्रेमवर्क में $filter का उपयोग करने की आवश्यकता होती है। हालांकि MongoDB .NET ड्राइवर और IQueryable का उपयोग करके इसे प्राप्त करने का एक आसान तरीका है इंटरफ़ेस।
सरलतम मॉडल को ध्यान में रखते हुए:
public class MyModel
{
public string _id { get; set; }
public IEnumerable<MyNestedModel> myArray { get; set; }
}
public class MyNestedModel
{
public string other { get; set; }
}
और निम्नलिखित डेटा:
var m = new MyModel()
{
_id = "1",
myArray = new List<MyNestedModel>() {
new MyNestedModel() { other = "stuff" },
new MyNestedModel() { other = "stuff" },
new MyNestedModel() { other = "stuff2" } }
};
Col.InsertOne(m);
आप बस .AsQueryable()
call पर कॉल कर सकते हैं अपने संग्रह पर और फिर आप LINQ क्वेरी लिख सकते हैं जिसका अनुवाद MongoDB ड्राइवर द्वारा $filter
में किया जाएगा , कोशिश करें:
var query = from doc in Col.AsQueryable()
where doc._id == "1"
select new MyModel()
{
_id = doc._id,
myArray = doc.myArray.Where(x => x.other == "stuff")
};
var result = query.ToList();
संपादित करें:
वैकल्पिक रूप से आप $filter
. लिख सकते हैं कच्चे स्ट्रिंग के रूप में भाग लें और फिर .Aggregate()
. का उपयोग करें तरीका। इस दृष्टिकोण का उपयोग करने के लिए आपको सभी गुणों को "मानचित्र" करने की आवश्यकता नहीं है, हालांकि दोष यह है कि आप प्रकार की सुरक्षा खो रहे हैं क्योंकि यह सिर्फ एक स्ट्रिंग है, कोशिश करें:
var addFields = BsonDocument.Parse("{ \"$addFields\": { myArray: { $filter: { input: \"$myArray\", as: \"m\", cond: { $eq: [ \"$$m.other\", \"stuff\" ] } } } } }");
var query = Col.Aggregate()
.Match(x => x._id == "1")
.AppendStage<MyModel>(addFields);
$addFields
यहां मौजूदा फ़ील्ड को अधिलेखित करने के लिए उपयोग किया जाता है।