Je nachdem, ob Ihre unstrukturierten Daten zur Kompilierzeit oder zur Laufzeit bekannt sind, gibt es verschiedene Möglichkeiten, dies zu erreichen.
Beim Kompilierungstyp können Sie Ihre Projektion der Daten modellieren und den Projektionsgenerator verwenden, um anzugeben, wie Ihre Projektion funktionieren soll
var collection = database.GetCollection<Customer>("customers");
var document = new Customer(){Name = "Joe Bloggs", Age = 30, Address = "York"};
collection.InsertOne(document);
var projection = Builders<Customer>
.Projection
.Include(x => x.Id).Include(x => x.Age);
var customerProjection = await collection.Find(x => true)
.Project<CustomerProjection>(projection)
.FirstAsync();
Oben haben wir den Rückgabetyp als generisches Argument angegeben, aber wenn wir dies weglassen, wird ein BsonDocument
zurückgegeben was je nach Nutzung nützlich sein kann
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Wir können das gleiche Ergebnis auch erreichen, indem wir den linq-Ausdruck verwenden:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Dies führt zur Rückgabe eines anonymen Typs mit einer ID und einem Alter.
Wenn wir die Daten jedoch zur Kompilierzeit nicht kennen und die Felder zur Laufzeit auf Magic Strings basieren, müssen Sie BsonDocument
übergeben in die GetCollection
Methode:
var collection = database.GetCollection<BsonDocument>("customers");
Sie können jetzt beide der oben genannten Methoden anwenden, um das bson-Dokument zu projizieren, aber es wird auf einer Pro-Feld-Basis sein.
Ich würde jedoch empfehlen, die Projektersteller zu verwenden, da dies Ihr Leben ein wenig einfacher machen wird:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();