Có một số cách bạn có thể đạt được điều này tùy thuộc vào việc dữ liệu phi cấu trúc của bạn có được biết vào thời gian biên dịch hay thời gian chạy hay không.
Đối với loại biên dịch, bạn có thể mô hình hóa phép chiếu dữ liệu của mình và sử dụng trình tạo phép chiếu để chỉ định cách hoạt động của phép chiếu
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();
Ở trên, chúng tôi đã chỉ định kiểu trả về là đối số chung nhưng nếu chúng tôi bỏ qua điều này thì chúng tôi sẽ được trả về một BsonDocument
có thể hữu ích tùy thuộc vào cách sử dụng của bạn
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Chúng ta cũng có thể đạt được kết quả tương tự bằng cách sử dụng biểu thức linq:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Điều này sẽ dẫn đến việc trả về một loại bất thường có Id và Tuổi.
Tuy nhiên, nếu chúng tôi không biết dữ liệu tại thời điểm biên dịch và đang dựa trên các trường của chuỗi ma thuật trong thời gian chạy thì bạn cần phải chuyển vào BsonDocument
vào GetCollection
phương pháp:
var collection = database.GetCollection<BsonDocument>("customers");
Bây giờ bạn sẽ có thể thực hiện cả hai phương pháp trên để chiếu tài liệu bson nhưng nó sẽ tùy thuộc vào từng trường.
Tuy nhiên, tôi khuyên bạn nên thử sử dụng Trình xây dựng dự án vì nó sẽ giúp cuộc sống của bạn dễ dàng hơn một chút:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();