MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Leggi valori di campo specifici da MongodbC#

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();