標籤:運算式 ack bsp 其他 表示 之間 base pen over
一、MongoDB 排序MongoDB sort() 方法
在 MongoDB 中使用 sort() 方法對資料進行排序,sort() 方法可以通過參數指定排序的欄位,並使用 1 和 -1 來指定排序的方式,其中 1 為升序排列,而 -1 是用於降序排列。
文法
sort()方法基本文法如下所示:
>db.COLLECTION_NAME.find().sort({KEY:1})
執行個體
col 集合中的資料如下:
{ "_id" : ObjectId("5b554b9e7dc80c93e5d47b3a"), "title" : "study1", "description" : "mongodb study", "by" : "cara1", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 200 }
{ "_id" : ObjectId("5b554bc37dc80c93e5d47b3b"), "title" : "study2", "description" : "mongodb study", "by" : "cara2", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 150 }
{ "_id" : ObjectId("5b554bd47dc80c93e5d47b3c"), "title" : "study3", "description" : "mongodb study", "by" : "cara3", "url" : "http://cara.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
以下執行個體示範了 col 集合中的資料按欄位 likes 的降序排列:
> db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
{ "title" : "study1" }
{ "title" : "study2" }
{ "title" : "study3" }
二、MongoDB 索引
索引通常能夠極大的提高查詢的效率,如果沒有索引,MongoDB在讀取資料時必須掃描集合中的每個檔案並選取那些符合查詢條件的記錄。
這種掃描全集合的查詢效率是非常低的,特別在處理大量的資料時,查詢可以要花費幾十秒甚至幾分鐘,這對網站的效能是非常致命的。
索引是特殊的資料結構,索引儲存在一個易於遍曆讀取的資料集合中,索引是對資料庫表中一列或多列的值進行排序的一種結構
createIndex() 方法
MongoDB使用 createIndex() 方法來建立索引。
注意在 3.0.0 版本前建立索引方法為 db.collection.ensureIndex(),之後的版本使用了 db.collection.createIndex() 方法,ensureIndex() 還能用,但只是 createIndex() 的別名。
文法
createIndex()方法基本文法格式如下所示:
>db.collection.createIndex(keys, options)
文法中 Key 值為你要建立的索引欄位,1 為指定按升序建立索引,如果你想按降序來建立索引指定為 -1 即可。
執行個體
> db.col.createIndex({"title":1})
createIndex() 方法中你也可以設定使用多個欄位建立索引(關係型資料庫中稱作複合索引)。
>db.col.createIndex({"title":1,"description":-1})>
createIndex() 接收選擇性參數,選擇性參數列表如下:
Parameter |
Type |
Description |
background |
Boolean |
建索引過程會阻塞其它資料庫操作,background可指定以後台方式建立索引,即增加 "background" 選擇性參數。 "background" 預設值為false。 |
unique |
Boolean |
建立的索引是否唯一。指定為true建立唯一索引。預設值為false. |
name |
string |
索引的名稱。如果未指定,MongoDB的通過串連索引的欄位名和排序次序產生一個索引名稱。 |
dropDups |
Boolean |
在建立唯一索引時是否重複資料刪除記錄,指定 true 建立唯一索引。預設值為 false. |
sparse |
Boolean |
對文檔中不存在的欄位資料不啟用索引;這個參數需要特別注意,如果設定為true的話,在索引欄位中不會查詢出不包含對應欄位的文檔.。預設值為 false. |
expireAfterSeconds |
integer |
指定一個以秒為單位的數值,完成 TTL設定,設定集合的存留時間。 |
v |
index version |
索引的版本號碼。預設的索引版本取決於mongod建立索引時啟動並執行版本。 |
weights |
document |
索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其他索引欄位的得分權重。 |
default_language |
string |
對於文本索引,該參數決定了停用詞及詞乾和詞器的規則的列表。 預設為英語 |
language_override |
string |
對於文本索引,該參數指定了包含在文檔中的欄位名,語言覆蓋預設的language,預設值為 language. |
執行個體
在後台建立索引:
db.values.createIndex({open: 1, close: 1}, {background: true})
通過在建立索引時加 background:true 的選項,讓建立工作在後台執行
三、MongoDB 彙總
MongoDB中彙總(aggregate)主要用於處理資料(諸如統計平均值,求和等),並返回計算後的資料結果。有點類似sql語句中的 count(*)。
aggregate() 方法
MongoDB中彙總的方法使用aggregate()。
文法
aggregate() 方法的基本文法格式如下所示:
>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
執行個體
集合中的資料如下:
> db.col.find().pretty()
{
"_id" : ObjectId("5b554b9e7dc80c93e5d47b3a"),
"title" : "study1",
"description" : "mongodb study",
"by" : "cara1",
"url" : "http://cara.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 200
}
{
"_id" : ObjectId("5b554bc37dc80c93e5d47b3b"),
"title" : "study2",
"description" : "mongodb study",
"by" : "cara2",
"url" : "http://cara.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 150
}
{
"_id" : ObjectId("5b554bd47dc80c93e5d47b3c"),
"title" : "study3",
"description" : "mongodb study",
"by" : "cara3",
"url" : "http://cara.com",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
現在我們通過以上集合計算每個作者所寫的文章數,使用aggregate()計算結果如下:
> db.col.aggregate([{$group : {_id : "$by", num_tutorial : {$sum : 1}}}])
{ "_id" : "cara3", "num_tutorial" : 1 }
{ "_id" : "cara2", "num_tutorial" : 1 }
{ "_id" : "cara1", "num_tutorial" : 1 }
>
以上執行個體類似sql語句: select by_user, count(*) from mycol group by by_user
在上面的例子中,我們通過欄位by_user欄位對資料進行分組,並計算by_user欄位相同值的總和。
下表展示了一些彙總的運算式:
運算式 |
描述 |
執行個體 |
$sum |
計算總和。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}]) |
$avg |
計算平均值 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}]) |
$min |
擷取集合中所有文檔對應值得最小值。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}]) |
$max |
擷取集合中所有文檔對應值得最大值。 |
db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}]) |
$push |
在結果文檔中插入值到一個數組中。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}]) |
$addToSet |
在結果文檔中插入值到一個數組中,但不棄置站台。 |
db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}]) |
$first |
根據資來源文件的排序擷取第一個文檔資料。 |
db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}]) |
$last |
根據資來源文件的排序擷取最後一個文檔資料 |
db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}]) |
MongoDB相關方法