码迷,mamicode.com
首页 > 数据库 > 详细

Mongodb高级查询【二】

时间:2018-01-10 18:38:43      阅读:235      评论:0      收藏:0      [点我收藏+]

标签:mongod   筛选   list   mongodb   pos   getc   高级   gpo   ==   

上一篇文章,写了 mongodb常规操作,继续写入,本章主要讲高级查询,文本,聚集,大数据查询。

Mongodb的查询语法是很多的,是NOSQL队伍中比较丰富的一个。当然有很多查询跟关系型查询无法相比。例如联表查询,Mongodb并不擅长联表查询,虽然出一个$lookup支持两个集合之间关联,不过跟关系相比之就逊色多了。

 Mongodb的查询种类很丰富,这里就不一一讲解,挑一些常用的写出来,作一个笔记。

一  聚合查询

mongodb对数据统计,筛选引用aggregate()进行聚合查询。功能相当强大。

常用几个操作符

$project:修改文档的结构(重命名、增加或删除域),也可以用于创建计算结果以及嵌套文档。

$unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。

$match:过滤数据,只输出符合条件的文档。

$limit:限制MongoDB聚合管道返回的文档数。

$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聚合查询,笔记到这里。

 

Mongodb高级查询【二】

标签:mongod   筛选   list   mongodb   pos   getc   高级   gpo   ==   

原文地址:https://www.cnblogs.com/NET-BLOG/p/8252166.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!