sql >> Base de Datos >  >> NoSQL >> MongoDB

Leer valores de campo específicos de MongodbC#

Hay algunas formas en que puede lograr esto dependiendo de si sus datos no estructurados se conocen en tiempo de compilación o en tiempo de ejecución.

Para el tipo de compilación, puede modelar su proyección de los datos y usar el generador de proyección para especificar cómo debería funcionar su proyección

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

Arriba especificamos el tipo de devolución como argumento genérico, pero si omitimos esto, se nos devolverá un BsonDocument que puede ser útil dependiendo de su uso

var bsonDocument = await collection.Find(x => true)
                    .Project(projection)
                    .FirstAsync();

También podemos lograr el mismo resultado usando la expresión linq:

var projection = await collection.Find(x => true)
    .Project(x => new {x.Id, x.Age}).FirstAsync();

Esto dará como resultado la devolución de un tipo anónimo con una identificación y una edad.

Sin embargo, si no conocemos los datos en el momento de la compilación y estamos basando los campos de cadenas mágicas en el tiempo de ejecución, deberá pasar BsonDocument a la GetCollection método:

var collection = database.GetCollection<BsonDocument>("customers");

Ahora podrá realizar los dos métodos anteriores para proyectar el documento bson, pero será por campo.

Sin embargo, te aconsejo que intentes usar los constructores de proyectos, ya que te facilitará un poco la vida:

var projectionDefinition = Builders<BsonDocument>.Projection
                                        .Include("age")
                                        .Exclude("_id");

var projection = await collection.Find(x => true)
                    .Project(projectionDefinition)
                    .FirstAsync();