Mongodb高級查詢【二】

上一篇文章,寫了 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聚合查詢,筆記到這裏。

相關文章
相關標籤/搜索