非構造化データがコンパイル時または実行時に認識されているかどうかに応じて、これを実現する方法はいくつかあります。
コンパイルタイプの場合、データのプロジェクションをモデル化し、プロジェクションビルダーを使用してプロジェクションがどのように機能するかを指定できます
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();
これにより、IDと年齢を含む匿名型が返されます。
ただし、コンパイル時にデータがわからず、実行時にマジックストリングのフィールドに基づいている場合は、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();