sql >> Database >  >> NoSQL >> MongoDB

MongoDB c# haalt alle overeenkomende elementen in een array binnen een document op met behulp van Definition builder

De vraag beschrijft de use-case niet volledig, dus ik heb een paar mogelijke opties bedacht die u kunt verkennen op basis van een paar aannames, in het bijzonder zijn ze afhankelijk van de beschikbaarheid van LINQ en het targeten van een enkel document tegelijk ( en dat je waarschijnlijk niet meer code wilt dan je echt nodig hebt):

1) Een variatie op wat je hebt. Gebruik een standaard find met een projectie en LINQ-uitdrukking.

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) Gebruik de aggregatiepijplijn (u kunt dezelfde projectie gebruiken als hierboven)

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) Trek het document terug met alle array-elementen en filter vervolgens lokaal met LINQ. Aan de positieve kant is dit een kleine hoeveelheid leesbare code, maar het brengt het hele document terug voordat het wordt gefilterd. Afhankelijk van uw exacte gebruik kan dit acceptabel zijn.

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

Als LINQ echt is geen optie dan is er een voorbeeld hier dat laat zien hoe u de projectie zou kunnen converteren naar niet ons LINQ. Totaal niet getest, maar zou iets zijn in de trant van:

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. Query op MongoDB GridFS-metadata (Java)

  2. MongoDB op Linux laten luisteren naar externe verbindingen

  3. Hoe controleer ik of redis actief is voordat ik flask start (en start het als dit niet het geval is)?

  4. 5 manieren om rijen te selecteren met de minimumwaarde voor hun groep in SQL