最近我开始使用MongoDB。我必须使用mongodb C#driver从mongodb读取特定字段(列)。这意味着我必须读取特定字段,无论值是什么。我只需指定字段。我有非结构化我的db.so中的数据我的项目中没有模型类。
我使用Getcollection<>读取了Collection来自C#库。然后我坚持完成这项任务。
我如何实现?
答案 0 :(得分:0)
有几种方法可以实现这一点,具体取决于编译时或运行时是否知道非结构化数据。
对于编译类型,您可以对数据的投影进行建模,并使用投影构建器指定投影的工作方式
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();
上面我们将返回类型指定为泛型参数,但如果我们省略了这个,那么我们将返回BsonDocument
,根据您的使用情况,这将是有用的
var bsonDocument = await collection.Find(x => true)
.Project(projection)
.FirstAsync();
我们也可以使用linq表达式获得相同的结果:
var projection = await collection.Find(x => true)
.Project(x => new {x.Id, x.Age}).FirstAsync();
这将导致返回带有Id和年龄的异常类型。
但是,如果我们在编译时不知道数据并且在运行时基于魔术字符串的字段,那么您需要将BsonDocument
传递给GetCollection
方法:
var collection = database.GetCollection<BsonDocument>("customers");
您现在可以使用上述两种方法来投影bson文档,但它将基于每个字段。
但是,我建议尝试使用Project构建器,因为它会让您的生活更轻松:
var projectionDefinition = Builders<BsonDocument>.Projection
.Include("age")
.Exclude("_id");
var projection = await collection.Find(x => true)
.Project(projectionDefinition)
.FirstAsync();