上一篇文章,写了 mongodb常规操做,继续写入,本章主要讲高级查询,文本,汇集,大数据查询。html
Mongodb的查询语法是不少的,是NOSQL队伍中比较丰富的一个。固然有不少查询跟关系型查询没法相比。例如联表查询,Mongodb并不擅长联表查询,虽然出一个$lookup支持两个集合之间关联,不过跟关系相比之就逊色多了。mongodb
Mongodb的查询种类很丰富,这里就不一一讲解,挑一些经常使用的写出来,做一个笔记。数组
一 聚合查询数据结构
mongodb对数据统计,筛选引用aggregate()进行聚合查询。功能至关强大。dom
经常使用几个操做符测试
$project:修改文档的结构(重命名、增长或删除域),也能够用于建立计算结果以及嵌套文档。大数据
$unwind:将文档中的某一个数组类型字段拆分红多条,每条包含数组中的一个值。spa
$match:过滤数据,只输出符合条件的文档。3d
$limit:限制MongoDB聚合管道返回的文档数。code
$skip:在聚合管道中跳过指定数量的文档。
$group:将集合中的文档分组,可用于统计结果。
$sort:文档排序输出。
$sum 计算总和
以上这几个操做符,是最经常使用的,mongodb中必需要掌握的操做符。下面一个,一个用net core示例讲解,将依然使用这个 系列第一篇数据结构,有不了解的同窗能够去看一看第一篇。
咱们先尝试添加一些模拟数据,以方便程序测试。
class Program { static void Main(string[] args) { MongoClient client = new MongoClient("mongodb://192.168.99.5"); IMongoDatabase dbBase = client.GetDatabase("School"); IMongoCollection<Class> collection = dbBase.GetCollection<Class>("Class"); //生成随机数使用 Random random = new Random(); var nameItems1 = "赵、钱、孙、李、周、吴、郑、王、冯、陈、楮、卫、蒋、沈、韩、杨、朱、秦、尤、许、何".Split("、").ToList(); var nameItems2 = "盼丽、艳红、甜甜、璨、彬彬、银红、晨曦、婷、广荣、蓓、小艳、欣如、辅仁、嘉、雯婷".Split("、").ToList(); for (var i = 1; i < 7; i++) { collection.InsertOne(new Class { ClassName = $"{i}年级", StudentItems = ((Func<List<Student>>)(() => { var studentItems = new List<Student>(); var studentCount = random.Next(5, 15); for (var t = 0; t < studentCount; t++) { studentItems.Add(new Student { Age = random.Next(6, 12), Name = nameItems1[random.Next(0, nameItems1.Count)] + nameItems2[random.Next(0, nameItems2.Count)], Sex = random.Next(1, 3) == 1 ? "男" : "女" }); } return studentItems; }))() }); } } } public class Class { public BsonObjectId Id { set; get; } public string ClassName { set; get; } public List<Student> StudentItems { set; get; } } public class Student { public string Name { set; get; } public int Age { set; get; } public string Sex { set; get; } }
collection.Aggregate<> //是一个泛型方法,返回类型能够是BsonDocument或实体,自动序列化。 //例如 collection.Aggregate<BsonDocument>() collection.Aggregate<实体类>() //值得一提的是Aggregate()接受的参数是PipelineDefinition,而PipelineDefinition类中使用implicit 类型转换运算符。因此直接输入参数便可
$project 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument { { "$project", new BsonDocument("StudentItems", 1) } } }).ToList();
结果:你会发现StudentItems 被单独提取出来
$unwind 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument ("$unwind","$StudentItems") }).ToList();
结果:你会发现StudentItems 的每一项都抽出来与原来的文档组成一个新的文档
通常状况,$project和$unwind组合使用。好比提取出StudentItems 每一项组成一个文档。例如
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument { { "$project", new BsonDocument("StudentItems", 1) } }, new BsonDocument ("$unwind","$StudentItems") }).ToList();
结果:
$match 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument { { "$match", new BsonDocument("ClassName", "1年级") } } }).ToList();
结果:
$limit 操做符
$skip 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument("$skip",2), new BsonDocument("$limit",3) }).ToList();
结果:跳过前两条以后,选择前三条。例如:组合于分页的应用
$group 操做符
$sum 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument { { "$group", new BsonDocument { { "_id", new BsonDocument("ClassName","$ClassName")}, { "count", new BsonDocument ("$sum",1) }} } } }).ToList();
结果:按年级分组,而且统计每组总行数
$sort 操做符
var items = collection.Aggregate<BsonDocument>(new[] { new BsonDocument { { "$sort", new BsonDocument ("ClassName",-1)}} }).ToList();
注意:操做符顺序很重要,前后顺序不一样,会致使结果不同。
mongodb聚合查询,笔记到这里。