MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Sterownik Mongodb C# zwraca tylko pasujące dokumenty podrzędne w tablicy

Zazwyczaj musisz użyć $filter w ramach agregacji, aby filtrować zagnieżdżoną tablicę. Istnieje jednak prostszy sposób na osiągnięcie tego za pomocą sterownika MongoDB .NET i IQueryable interfejs.

Biorąc pod uwagę najprostszy model:

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

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

oraz następujące dane:

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

możesz po prostu wywołać .AsQueryable() w swojej kolekcji, a następnie możesz napisać zapytanie LINQ, które zostanie przetłumaczone przez sterownik MongoDB na $filter , spróbuj:

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

EDYCJA:

Alternatywnie możesz napisać $filter część jako nieprzetworzony ciąg, a następnie użyj .Aggregate() metoda. Korzystając z tego podejścia, nie musisz „mapować” wszystkich właściwości, jednak wadą jest to, że tracisz bezpieczeństwo typu, ponieważ jest to tylko ciąg, spróbuj:

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 służy tutaj do zastąpienia istniejącego pola.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Zrozumienie indeksów MongoDB

  2. Użyj więcej niż jednego schematu na kolekcję w mongodb

  3. Dynamiczne połączenie bazy danych z mongodb lub mongoose z nodejs

  4. MongoDB $tygodniowa aktualizacja nr 66 (22 kwietnia 2022 r.):Hackathony, mongosh i Github

  5. Przechowywanie zagnieżdżonych struktur za pomocą mgo