MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB c# ruft alle übereinstimmenden Elemente in einem Array innerhalb eines Dokuments mit dem Definition Builder ab

Die Frage beschreibt den Anwendungsfall nicht vollständig, daher habe ich einige potenzielle Optionen entwickelt, die Sie auf der Grundlage einiger Annahmen untersuchen können, insbesondere davon, dass LINQ verfügbar ist und jeweils auf ein einzelnes Dokument abzielt ( und dass Sie wahrscheinlich nicht mehr Code wollen, als Sie wirklich brauchen):

1) Eine Variation dessen, was Sie haben. Verwenden Sie ein Standard-find mit einer Projektion und einem LINQ-Ausdruck.

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) Verwenden Sie die Aggregationspipeline (Sie könnten dieselbe Projektion wie oben verwenden)

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) Ziehen Sie das Dokument mit allen Array-Elementen zurück und filtern Sie es dann lokal mit LINQ. Auf der positiven Seite ist dies eine kleine Menge lesbaren Codes, der jedoch das gesamte Dokument vor dem Filtern zurückbringt. Abhängig von Ihrer genauen Verwendung kann dies durchaus akzeptabel sein.

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

Wenn LINQ wirklich keine Option ist, dann gibt es ein Beispiel hier das zeigt, wie Sie die Projektion in not us LINQ umwandeln könnten. Völlig ungetestet, wäre aber etwas in der Art von:

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