sql >> Database teknologi >  >> NoSQL >> MongoDB

Mongodb C#-driver returnerer kun matchende underdokumenter i array

Typisk skal du bruge $filter i Aggregation Framework for at filtrere indlejret array. Men der er en nemmere måde at opnå dette ved at bruge MongoDB .NET Driver og IQueryable grænseflade.

I betragtning af den enkleste model:

public class MyModel
{
    public string _id { get; set; }
    public IEnumerable<MyNestedModel> myArray { get; set; }
}

public class MyNestedModel
{
    public string other { get; set; }
}

og følgende data:

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);

du kan blot kalde .AsQueryable() på din samling, og derefter kan du skrive LINQ-forespørgsel, som vil blive oversat af MongoDB-driveren til $filter , prøv:

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();

EDIT:

Alternativt kan du skrive $filter del som en rå streng, og brug derefter .Aggregate() metode. Ved at bruge denne tilgang behøver du ikke at "kortlægge" alle egenskaber, men ulempen er, at du mister typesikkerhed, da dette kun er en streng, prøv:

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 bruges her til at overskrive eksisterende felt.




  1. MongoDB kort()

  2. Få alle nøgler i Redis-databasen med python

  3. MongoDB kortlægge/reducere over flere samlinger?

  4. Hvorfor er MongoDB så hurtigt