Ada beberapa cara untuk mencapainya tergantung pada apakah data tidak terstruktur Anda diketahui pada waktu kompilasi atau waktu proses.
Untuk jenis kompilasi, Anda dapat memodelkan proyeksi data dan menggunakan pembuat proyeksi untuk menentukan cara kerja proyeksi Anda
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();
Di atas kami menentukan tipe pengembalian sebagai argumen umum tetapi jika kami menghilangkan ini maka kami akan mengembalikan BsonDocument
yang dapat berguna tergantung pada penggunaan Anda
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Kami juga dapat mencapai hasil yang sama dengan menggunakan ekspresi linq:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Ini akan menghasilkan jenis anonim dengan Id dan Umur.
Namun jika kami tidak mengetahui data pada waktu kompilasi dan mendasarkan bidang string ajaib saat runtime, maka Anda harus memasukkan BsonDocument
ke GetCollection
metode:
var collection = database.GetCollection<BsonDocument>("customers");
Anda sekarang dapat melakukan kedua metode di atas untuk memproyeksikan dokumen bson tetapi akan dilakukan per bidang.
Namun, saya sarankan mencoba menggunakan pembuat Proyek karena akan membuat hidup Anda sedikit lebih mudah:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();