Има няколко начина, по които можете да постигнете това в зависимост от това дали вашите неструктурирани данни са известни по време на компилиране или по време на изпълнение.
За тип компилиране можете да моделирате своята проекция на данните и да използвате конструктора на проекция, за да посочите как трябва да работи вашата проекция
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();
По-горе посочихме типа на връщането като общ аргумент, но ако пропуснем това, тогава ще ни бъде върнат BsonDocument
което може да бъде полезно в зависимост от вашата употреба
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Можем също да постигнем същия резултат, като използваме linq израз:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Това ще доведе до връщане на анонимен тип с идентификатор и възраст.
Ако обаче не знаем данните по време на компилиране и базираме полетата на магически низове по време на изпълнение, тогава ще трябва да подадете BsonDocument
към GetCollection
метод:
var collection = database.GetCollection<BsonDocument>("customers");
Вече ще можете да използвате и двата метода по-горе, за да проектирате bson документа, но това ще бъде на базата на поле.
Въпреки това бих ви посъветвал да опитате да използвате създателите на проекти, тъй като това ще направи живота ви малко по-лесен:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();