Ci sono alcuni modi in cui puoi ottenere questo risultato a seconda che i tuoi dati non strutturati siano noti in fase di compilazione o in fase di esecuzione.
Per il tipo di compilazione, puoi modellare la tua proiezione dei dati e utilizzare il generatore di proiezioni per specificare come dovrebbe funzionare la tua proiezione
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();
Sopra abbiamo specificato il tipo restituito come argomento generico, ma se lo omettiamo, verrà restituito un BsonDocument
che può essere utile a seconda del tuo utilizzo
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
Possiamo anche ottenere lo stesso risultato usando l'espressione linq:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
Ciò comporterà la restituzione di un tipo anonimo con un ID e un'età.
Tuttavia, se non conosciamo i dati in fase di compilazione e stiamo basando i campi delle stringhe magiche in fase di esecuzione, dovrai passare BsonDocument
al GetCollection
metodo:
var collection = database.GetCollection<BsonDocument>("customers");
Ora sarai in grado di eseguire entrambi i metodi precedenti per proiettare il documento bson, ma sarà per campo.
Tuttavia, ti consiglio di provare a utilizzare i Costruttori di progetti in quanto ti semplificheranno la vita:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();