Der er et par måder, du kan opnå dette på, afhængigt af om dine ustrukturerede data er kendt på kompileringstidspunktet eller kørselstidspunktet.
For kompileringstype kan du modellere din projektion af dataene og bruge projektionsbyggeren til at specificere, hvordan din projektion skal fungere
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();
Ovenfor har vi angivet returtypen som det generiske argument, men hvis vi udelader dette, vil vi blive returneret et BsonDocument
hvilket kan være nyttigt afhængigt af dit brug
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Vi kan også opnå det samme resultat ved at bruge linq udtryk:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Dette vil resultere i at returnere en anonym type med et id og en alder.
Men hvis vi ikke kender dataene på kompileringstidspunktet og baserer felterne med magiske strenge under kørsel, skal du indsende BsonDocument
til GetCollection
metode:
var collection = database.GetCollection<BsonDocument>("customers");
Du vil nu være i stand til at gøre begge de ovennævnte metoder til at projicere bson-dokumentet, men det vil være pr. felt.
Jeg vil dog råde dig til at prøve at bruge projektbyggere, da det vil gøre dit liv lidt lettere:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();