Er zijn een paar manieren waarop u dit kunt bereiken, afhankelijk van of uw ongestructureerde gegevens bekend zijn tijdens het compileren of uitvoeren.
Voor het compileertype kunt u uw projectie van de gegevens modelleren en de projectiebouwer gebruiken om te specificeren hoe uw projectie zou moeten werken
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();
Hierboven hebben we het retourtype gespecificeerd als het generieke argument, maar als we dit weglaten, krijgen we een BsonDocument
terug wat handig kan zijn, afhankelijk van uw gebruik
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
We kunnen hetzelfde resultaat ook bereiken door de linq-expressie te gebruiken:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Dit zal resulteren in het retourneren van een anoniem type met een Id en Leeftijd.
Als we de gegevens echter niet kennen tijdens het compileren en de velden van magische tekenreeksen tijdens runtime baseren, moet u BsonDocument
doorgeven naar de GetCollection
methode:
var collection = database.GetCollection<BsonDocument>("customers");
U kunt nu beide bovenstaande methoden gebruiken om het bson-document te projecteren, maar dit is per veld.
Ik raad u echter aan om de projectbouwers te gebruiken, omdat dit uw leven een beetje gemakkelijker zal maken:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();