Existuje několik způsobů, jak toho dosáhnout v závislosti na tom, zda jsou vaše nestrukturovaná data známá v době kompilace nebo za běhu.
Pro typ kompilace můžete modelovat svou projekci dat a pomocí tvůrce projekce určit, jak má vaše projekce fungovat
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();
Výše jsme zadali návratový typ jako obecný argument, ale pokud jej vynecháme, vrátíme BsonDocument
což může být užitečné v závislosti na vašem použití
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Stejného výsledku můžeme dosáhnout také použitím výrazu linq:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Výsledkem bude vrácení neobvyklého typu s ID a věkem.
Pokud však neznáme data v době kompilace a zakládáme pole magických řetězců za běhu, budete muset předat BsonDocument
do GetCollection
metoda:
var collection = database.GetCollection<BsonDocument>("customers");
Nyní budete moci použít obě výše uvedené metody pro projektování dokumentu bson, ale bude to na bázi jednotlivých polí.
Nicméně bych vám doporučil zkusit použít Project builders, protože vám to trochu usnadní život:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();