sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB c# hämtar alla matchande element i en array i ett dokument med hjälp av definitionsbyggaren

Frågan beskriver inte helt användningsfallet så jag har kommit på några möjliga alternativ för dig att utforska baserat på några antaganden, särskilt de beror på att LINQ är tillgängligt och riktar in sig på ett enda dokument åt gången ( och att du förmodligen inte vill ha mer kod än du verkligen behöver):

1) En variation på vad du har. Använd en standard find med en projektion och LINQ-uttryck.

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) Använd aggregeringspipeline (du kan använda samma projektion som ovan)

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) Dra tillbaka dokumentet med alla arrayelement och filtrera sedan lokalt med LINQ. På plussidan är detta en liten mängd läsbar kod, men det tar tillbaka hela dokumentet innan det filtreras. Beroende på din exakta användning kan detta mycket väl vara acceptabelt.

var items3 = collection.AsQueryable()
    .SingleOrDefault(x => x.user == "Jone Doe")
    .fooArray.Where(x => x.plot == "circle");

Om LINQ verkligen är inte ett alternativ så finns det ett exempel här som visar hur du kan konvertera projektionen till inte oss LINQ. Helt oprövat men skulle vara något i stil med:

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


  1. Bindande dynamiskt serversvar (kapslade json)

  2. Diff() mellan två samlingar i MongoDB

  3. Kombinera två Redis-instanser till en enda instans med två dbs

  4. Hur kan jag beräkna totalt positivt, totalt negativt pris och summa med Node.js och Mongoose