Meestal moet u $filter gebruiken in Aggregation Framework om geneste arrays te filteren. Er is echter een eenvoudigere manier om dat te bereiken met MongoDB .NET Driver en IQueryable interface.
Gezien het eenvoudigste model:
public class MyModel
{
public string _id { get; set; }
public IEnumerable<MyNestedModel> myArray { get; set; }
}
public class MyNestedModel
{
public string other { get; set; }
}
en volgende gegevens:
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);
je kunt gewoon .AsQueryable()
. aanroepen op uw verzameling en dan kunt u een LINQ-query schrijven die door het MongoDB-stuurprogramma wordt vertaald naar $filter
, probeer:
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();
BEWERKEN:
U kunt ook $filter
. schrijven deel als een onbewerkte tekenreeks en gebruik vervolgens .Aggregate()
methode. Met deze aanpak hoeft u niet alle eigenschappen "in kaart te brengen", maar het nadeel is dat u de typeveiligheid verliest omdat dit slechts een tekenreeks is, probeer:
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
wordt hier gebruikt om een bestaand veld te overschrijven.