Można to osiągnąć na kilka sposobów, w zależności od tego, czy dane nieustrukturyzowane są znane w czasie kompilacji lub w czasie wykonywania.
W przypadku typu kompilacji możesz modelować swoją projekcję danych i użyć konstruktora projekcji, aby określić, jak powinna działać projekcja
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();
Powyżej określiliśmy zwracany typ jako argument ogólny, ale jeśli go pominiemy, otrzymamy zwrócony BsonDocument
co może być przydatne w zależności od sposobu użytkowania
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Ten sam wynik możemy również osiągnąć za pomocą wyrażenia linq:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Spowoduje to zwrócenie annomicznego typu z identyfikatorem i wiekiem.
Jeśli jednak nie znamy danych w czasie kompilacji i opieramy pola magicznych ciągów w czasie wykonywania, musisz przekazać BsonDocument
do GetCollection
metoda:
var collection = database.GetCollection<BsonDocument>("customers");
Teraz będziesz mógł wykonać obie powyższe metody, aby wyświetlić dokument bson, ale będzie to na podstawie pola.
Radzę jednak spróbować użyć kreatorów projektów, ponieważ ułatwią ci to życie:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();