2017-03-20 8 views
3

Wir haben eine Sammlung enthält Dokumente auf dem Server. Jedes Dokument ist wie folgt:Include/Exclude-Felder in Abfrage mit MongoDB C# -Treiber 2.4

{ _id: "...", Prop1: "", Prop2: "", Prop3: "", LargeField: "", ... } 

Es gibt viele andere Felder, aber sie werden nicht vom Client benötigt.

Ich möchte Dokumente als MyDoc Klasse laden, deren Definition ist:

public class MyDoc { 
    public string Id { get; set; } 
    public string Prop1 { get; set; } 
    public string Prop2 { get; set; } 
    public string Prop3 { get; set; } 
    public string LargeField { get; set; } 
} 

Ich habe versucht:

var client = new MongoClient(uri); 
var database = client.GetDatabase("MyDatabase"); 
var collection = database.GetCollection<MyDocs>("MyDocs"); 
var allDocs = collection.Find().ToList(); 

Dann wird es für jedes Dokument alle Felder laden, also muss ich Setzen Sie [BsonIgnoreExtraElements] auf MyDoc. Das Problem hier ist, dass das Dokument groß ist, aber ich brauche nur eine begrenzte Teilmenge von Feldern. Ist es möglich, den Fahrer wissen zu lassen, dass ich nur die in der Klasse definierten Felder brauche?

Wenn nicht, ist es möglich, einige der Felder wie LargeField auszuschließen, um die Ergebnismenge kleiner zu machen? Ich habe versucht:

var fieldsBuilder = Builders<MyDoc>.Projection; 
var fields = fieldsBuilder.Exclude(d => d.LargeField); 
var allDocs = collection.Find().Project(fields).ToList(); 

Aber jetzt allDocs wird BsonDocument Liste anstatt die MyDoc Liste. Wie kann man MyDoc mit Projektion abfragen?

Kann jemand helfen? Im Legacy-MongoDB-Treiber ist es ziemlich einfach, aber ich weiß nicht, wie man es in dem neuen Treiber macht. Vielen Dank.

Antwort

2

Ich hatte ein ähnliches Problem, ich glaube, Sie müssen den generischen Typ angeben, aus irgendeinem Grund übernimmt Project automatisch BsonDocument. Dies sollte es von BsonDocument zu Ihrer Klasse beheben.

Wechsel:

var allDocs = collection.Find().Project(fields).ToList(); 

An:

var allDocs = collection.Find<MyDoc>().Project<MyDoc>(fields).ToList(); 

Was, wie nur bestimmte Felder enthalten, kann dies nur geschehe, wie du es mit Builder tun (Include) oder mit einem Zeichenfolge in JSON-Form wie:

var allDocs = collection.Find<MyDoc>().Project<MyDoc>("{Prop1: 1, Prop2: 1}").ToList(); 

Ich würde sehr empfehlen, die Projektion auf diesem Typ p ost: https://www.codementor.io/pmbanugo/working-with-mongodb-in-net-part-3-skip-sort-limit-and-projections-oqfwncyka

Von diesem Artikel:

Dies bringt uns zu einem anderen Unterschied: mit einem Vorsprung Definition, wandelt es implizit den Dokumenttyp von Student BsonDocument, also was wir bekommen, ist wieder ein fließendes Objekt Das Ergebnis ist ein BsonDocument (obwohl wir mit dem Student-Typ arbeiten). Wenn wir mit Student arbeiten wollen, müssen wir angeben, dass wir den Typ immer noch für Student behalten möchten.

Verwandte Themen