Il existe plusieurs façons d'y parvenir selon que vos données non structurées sont connues au moment de la compilation ou de l'exécution.
Pour le type de compilation, vous pouvez modéliser votre projection des données et utiliser le générateur de projection pour spécifier comment votre projection doit fonctionner
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();
Ci-dessus, nous avons spécifié le type de retour comme argument générique, mais si nous l'omettons, nous recevrons un BsonDocument
qui peut être utile selon votre utilisation
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Nous pouvons également obtenir le même résultat en utilisant l'expression linq :
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Cela se traduira par le retour d'un type anonyme avec un identifiant et un âge.
Cependant, si nous ne connaissons pas les données au moment de la compilation et que nous basons les champs de chaînes magiques au moment de l'exécution, vous devrez transmettre BsonDocument
à GetCollection
méthode :
var collection = database.GetCollection<BsonDocument>("customers");
Vous pourrez désormais appliquer les deux méthodes ci-dessus pour projeter le document bson, mais ce sera par champ.
Cependant, je vous conseille d'essayer d'utiliser les générateurs de projet, car cela vous facilitera un peu la vie :
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();