成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

MongoDB管道操作符(二)

張率功 / 2051人閱讀

摘要:上篇文章中我們已經(jīng)學(xué)習(xí)了中幾個基本的管道操作符,本文我們再來看看其他的管道操作符。算術(shù)操作符通過算術(shù)操作符我們可以對分組后的文檔進行求和或者求平均數(shù)。好了,中的管道操作符我們就先說到這里,小伙伴們有問題歡迎留言討論。

上篇文章中我們已經(jīng)學(xué)習(xí)了MongoDB中幾個基本的管道操作符,本文我們再來看看其他的管道操作符。

本文是MongoDB系列的第十三篇文章,了解前面的文章有助于更好的理解本文:


1.Linux上安裝MongoDB
2.MongoDB基本操作
3.MongoDB數(shù)據(jù)類型
4.MongoDB文檔更新操作
5.MongoDB文檔查詢操作(一)
6.MongoDB文檔查詢操作(二)
7.MongoDB文檔查詢操作(三)
8.MongoDB查看執(zhí)行計劃
9.初識MongoDB中的索引
10.MongoDB中各種類型的索引
11.MongoDB固定集合
12.MongoDB管道操作符(一)


$group 基本操作

$group可以用來對文檔進行分組,比如我想將訂單按照城市進行分組,并統(tǒng)計出每個城市的訂單數(shù)量:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",count:{$sum:1}}})

我們將要分組的字段傳遞給$group函數(shù)的_id字段,然后每當(dāng)查到一個,就給count加1,這樣就可以統(tǒng)計出每個城市的訂單數(shù)量。

算術(shù)操作符

通過算術(shù)操作符我們可以對分組后的文檔進行求和或者求平均數(shù)。比如我想計算每個城市訂單運費總和,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",totalFreight:{$sum:"$freight"}}})

先按地址分組,再求和。這里貼出部分查詢結(jié)果,如下:

{
    "_id" : "HaiKou",
    "totalFreight" : 20.0
}
{
    "_id" : "HangZhou",
    "totalFreight" : 10.0
}

也可以計算每個城市運費的平均數(shù),如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",avgFreight:{$avg:"$freight"}}})

先按地址分組,然后再計算平均數(shù)。

極值操作符

極值操作符用來獲取分組后數(shù)據(jù)集的邊緣值,比如獲取每個城市最貴的運費,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",maxFreight:{$max:"$freight"}}})

查詢每個城市最便宜的運費:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",minFreight:{$min:"$freight"}}})

按城市分組之后,獲取該城市第一個運費單:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",firstFreight:{$first:"$freight"}}})

獲取分組后的最后一個運費單:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",lastFreight:{$last:"$freight"}}})
數(shù)據(jù)操作符

$addToSet可以將分組后的某一個字段放到一個數(shù)組中,但是重復(fù)的元素將只出現(xiàn)一次,而且元素加入到數(shù)組中的順序是無規(guī)律的,比如將分組后的每個城市的運費放到一個數(shù)組中,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$addToSet:"$freight"}}})

重復(fù)的freight將不會被添加進來。

$push則對重復(fù)的數(shù)據(jù)不做限制,都可以添加進來,如下:

db.sang_collect.aggregate({$group:{_id:"$orderAddressL",freights:{$push:"$freight"}}})
$unwind

$unwind用來實現(xiàn)對文檔的拆分,可以將文檔中的值拆分為多帶帶的文檔,比如我的數(shù)據(jù)如下:

{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "魯迅",
    "books" : [ 
        {
            "name" : "吶喊",
            "publisher" : "花城出版社"
        }, 
        {
            "name" : "彷徨",
            "publisher" : "南海出版出"
        }
    ]
}

使用$unwind命令將其拆分為獨立文檔,如下:

db.sang_books.aggregate({$unwind:"$books"})

拆分結(jié)果如下:

{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "魯迅",
    "books" : {
        "name" : "吶喊",
        "publisher" : "花城出版社"
    }
}
{
    "_id" : ObjectId("59f93c8b8523cfae4cf4ba86"),
    "name" : "魯迅",
    "books" : {
        "name" : "彷徨",
        "publisher" : "南海出版出"
    }
}
其他操作符

$sort操作可以對文檔進行排序,如下:

db.sang_collect.aggregate({$sort:{orderAddressL:1}})

用法和我們之前介紹普通搜索中的一致,可以按照存在的字段排序,也可以按照重命名的字段排序,如下:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$sort:{oa:-1}})

1表示升序、-1表示降序。

$limit返回結(jié)果中的前n個文檔,如下表示返回結(jié)果中的前三個文檔:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$limit:3})

$skip表示跳過前n個文檔,比如跳過前5個文檔,如下:

db.sang_collect.aggregate({$project:{oa:"$orderAddressL"}},{$skip:5})

$skip的效率低,要慎用。

總結(jié)

在管道開始執(zhí)行的階段盡可能過濾掉足夠多的數(shù)據(jù),這樣做有兩個好處:1.只有從集合中直接查詢時才會使用索引,盡早執(zhí)行過濾可以讓索引發(fā)揮作用;2.該過濾的數(shù)據(jù)過濾掉之后,也可以降低后面管道的執(zhí)行壓力。另外,MongoDB不允許一個聚合操作占用過多的內(nèi)存,如果有一個聚合操作占用了超過20%的內(nèi)存,則會直接報錯。

好了,MongoDB中的管道操作符我們就先說到這里,小伙伴們有問題歡迎留言討論。

參考資料:

1.《MongoDB權(quán)威指南第2版》

更多資料請關(guān)注公眾號:

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/19154.html

相關(guān)文章

  • mongoDB查詢進階】聚合管道(四) -- 累加器(Accumulators)

    摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當(dāng)在中使用時,累加器是針對每個分組使用的當(dāng)在中使用時,累加器則是針對每個字面量起作用。 回顧 相關(guān)文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...

    tomato 評論0 收藏0
  • mongoDB查詢進階】聚合管道(四) -- 累加器(Accumulators)

    摘要:累加器累加器本來只能使用與下,但是版本或以上,部分累加器還能使用于。當(dāng)在中使用時,累加器是針對每個分組使用的當(dāng)在中使用時,累加器則是針對每個字面量起作用。 回顧 相關(guān)文章回顧 mongoDB查詢進階--聚合管道(一)回顧mongoDB查詢進階--聚合管道(二)回顧mongoDB查詢進階--聚合管道(三)回顧 管道操作符的分類 管道操作符可以分為三類: 階段操作符(Stage Oper...

    wmui 評論0 收藏0
  • mongoDB查詢進階】聚合管道() -- 階段作符

    摘要:當(dāng)在中使用時,累加器是針對每個分組使用的當(dāng)在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統(tǒng)計的內(nèi)容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...

    brianway 評論0 收藏0
  • mongoDB查詢進階】聚合管道() -- 階段作符

    摘要:當(dāng)在中使用時,累加器是針對每個分組使用的當(dāng)在中使用時,累加器則是針對每個字面量起作用,具體用法下一篇文章闡述。另外再加以配合表達式操作符組成的表達式或者在或中使用累加器能查詢統(tǒng)計的內(nèi)容會更加的多樣化。 上篇最后說到管道操作符,本篇文章將詳細說一下管道操作符。 mongoDB查詢進階--聚合管道(一)回顧 什么是管道操作符(Aggregation Pipeline Operators) ...

    flybywind 評論0 收藏0
  • 手把手教你 MongoDB 的安裝與詳細使用(

    摘要:實例教程是一個數(shù)據(jù)庫搜云庫教程專注于開發(fā)技術(shù)的研究與知識分享方法中你也可以設(shè)置使用多個字段創(chuàng)建索引關(guān)系型數(shù)據(jù)庫中稱作復(fù)合索引。 上一篇文章練習(xí)了,MongoDB 的以下操作 安裝 MongoDB 服務(wù) 連接 MongoDB MongoDB 創(chuàng)建數(shù)據(jù)庫 MongoDB 刪除數(shù)據(jù)庫 MongoDB 插入文檔 MongoDB 刪除文檔 MongoDB 查詢文檔 MongoDB AND 條件...

    jayzou 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<