初识 MongoDB 和 .NET Core 入门 (2)

初识 MongoDB 和 .NET Core 入门

InsertMany() 可以插入批量数据:

Test1[] datas = new Test1[] { new Test1 { Name = "Test1" } }; collection1.InsertMany(datas); 统计数量

获取集合中所有的文档数:

collection1.CountDocuments(new BsonDocument()) // await collection1.CountDocumentsAsync(new BsonDocument());

任意一个文档集合对象,使用 CountDocuments(new BsonDocument()) 都是获得此集合的所有文档数,而不是此类型的文档数。例如:

var collection1 = database.GetCollection<Test1>("Test"); collection1.CountDocuments(new BsonDocument())

获取的并不是 Test1 类型的文档数量,而是整个集合所有文档的数量。

原因是,CountDocuments() 是一个过滤器函数,可以使用指定条件来筛选符合条件的文档的数量。指定条件后面会介绍。

查询

MongoDB 的查询并不像 LInq 中的表达式,基础了 IEnumerable或 IEnumerable<T> 接口,因此驱动没有 Where、Select 这种表达式的查询方法。

Find() 函数是查询函数,里面可以添加丰富的表达式,来筛选文档,当数据加载到本地内存后,即可使用丰富的表达式。

BsonDocument 是一个类型,代表了要查询的文档筛选条件,如果 BsonDocument 对象没有添加任何属性,则代码没有筛选参数,则默认所有文档都符号条件。

我们把 Test1 和 Test2 类型,都加上一个属性:

public ObjectId _id { get; set; }

不然会报格式化错误:System.FormatException

如何序列化文档

document 是文档对象, JsonSerializer 是 System.Text.Json 的静态类。

Console.WriteLine(JsonSerializer.Serialize(document)); 查询第一条记录 var document = collection1.Find(new BsonDocument()).FirstOrDefault(); 不加条件可能导致的问题

以下代码会导致程序报错:

var documents = await collection1.Find(new BsonDocument()).ToListAsync(); foreach(var item in documents) { Console.WriteLine(JsonSerializer.Serialize(item)); }

因为 collection1 是标记为 Test1 的文档集合;但是 .Find(new BsonDocument()) 是查询集合中的所有文档,因此获取到 Test2。

但是 Test2 是不能转为 Test1 的,因此,会导致程序报错。

查看所有文档 var documents = collection1.Find(new BsonDocument()).ToList(); var documents = await collection1.Find(new BsonDocument()).ToListAsync();

前面已经说过,如果集合中存在其它格式的文档,获取全部文档时,因为 Test2 跟 Test1 没任何关系,会导致 MongoDB.Driver 报错。

如果文档数量比较大,要使用异步的 ForEachAsync() 查询,其原理是 回调。

List<Test1> tests = new List<Test1>(); Action<Test1> action = item => { tests.Add(item); Console.WriteLine(JsonSerializer.Serialize(item)); }; await collection1.Find(new BsonDocument()).ForEachAsync(action); 查询结束

使用 Find() 以及后续函数查询后,要结束查询(延迟加载),可以使用 ToCursor() 函数结束,程序会立即开始查询并将数据返回内存。

转换查询

使用 ToEnumerable() 可以使用 Linq 来查询文档。

var list = collection1.Find(new BsonDocument()).ToCursor().ToEnumerable(); 过滤器

前面我们查询的时候都使用 .Find(new BsonDocument()),BsonDocument 是过滤器对象,里面存储了过滤的规则,但是我们不能直接设置 new BsonDocument() 中的属性,而是使用构建器FilterDefinitionBuilder对象,而此对象可以通过 MongoDB.Driver.Builders<TDocument>.Filter 创建 。

假设有以下数据集(文档):

5f8bdf88e63d14cb5f01dd85 小明 19 5f8bdf88e63d14cb5f01dd86 小红 20 5f8bdf88e63d14cb5f01dd87 小张 16 5f8bdf88e63d14cb5f01dd88 小小 17 # -----插入数据的代码----- public class Test { public ObjectId _id { get; set; } public string Name { get; set; } public int Age { get; set; } } var datas = new Test[] { new Test{,Age=19}, new Test{,Age=20}, new Test{,Age=16}, new Test{,Age=17} }; collection.InsertMany(datas);

使用构建器:

FilterDefinition<Test> filter = Builders<Test>.Filter

查询 Age 大于 18 的文档:

FilterDefinition<Test> filter = filterBuilder.Where(item => item.Age >= 18);

获取结果:

Test[] documents = collection.Find(filter).ToEnumerable<Test>().ToArray();

过滤器还有 Gt()、In()、Lte() 等非 Linq 的函数,需要查看文档学习。

Builders<TDocument>

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyfffy.html