MongoDB 指令

建立數據庫mysql

> use test1
> #直接使用use指令切換數據庫便可,可是因爲庫中沒有數據,因此並不會顯示在數據庫列表中。

查看當前所在庫sql

> db
test1

查看全部庫mongodb

> show dbs        # 並不會看到剛纔所建立的test1庫
admin   0.000GB   # 相似於mysql中的mysql庫
config  0.000GB    # 相似於mysql中的
local   0.000GB      # 相似於MySQL中的informa庫

能夠看到,咱們剛建立的數據庫 test1 並不在數據庫的列表中, 要顯示它,咱們須要向 test1 數據庫插入一些數據。
插入數據數據庫

> db.test1.insert( {"name":"張三"} )
> show dbs      # 當新的數據庫中有數據後,便可查看到庫
admin   0.000GB
config  0.000GB
local   0.000GB
test1   0.000GB

注:默認登陸到mongodb是在test庫,若是沒有建立新的數據庫,集合將存放在test數據庫中。在mongodb中,集合只有在內容插入後纔會建立,也就是說,建立集合(數據表)後要再插入一個文檔(記錄),集合纔會真正建立。
刪除數據庫數組

> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test1   0.000GB
> db
test1
> db.dropDatabase()      # 想要刪除某個數據庫,進入到那個庫,執行該指令便可刪除
{ "dropped" : "test1", "ok" : 1 }
> show dbs     # 確認數據庫test1被刪除
admin   0.000GB
config  0.000GB
local   0.000GB

建立集合
建立集合的語法格式以下:數據結構

db.createCollection(name, options)

參數說明:
name:要建立的集合名稱。
options:可選參數,指定有關內存大小及索引的選項app

options能夠是以下參數:框架

字段 類型 描述
capped 布爾 (可選)若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。當該值爲 true 時,必須指定 size 參數。
autoIndexId 布爾 (可選)如爲 true,自動在 _id 字段建立索引。默認爲 false。
size 數值 (可選)爲固定集合指定一個最大值,以千字節計(KB)。若是 capped 爲 true,也須要指定該字段。
max 數值 (可選)指定固定集合中包含文檔的最大數量。

在插入文檔時,MongoDB 首先檢查固定集合的 size 字段,而後檢查 max 字段。nosql

> db.createCollection("ray")        # 建立集合
# show collections或show tables指令均可以查看到已有集合
> show collections
ray
test1
> show tables
ray
test1

帶關鍵參數的建立集合語法ide

# 建立固定集合 mycol,整個集合空間大小 6142800 KB, 文檔最大個數爲 5 個。
> db.createCollection("mycol",{capped: true,autoIndexId: true,size:6142800,max:5})
# 當執行該指令後,會提示autoIndexId已經被棄用(它會自動建立索引),但集合依舊建立成功了
# 我設置了最大文檔數爲5個,是想測試下若是有5個文檔後,再繼續插入,會怎樣?
> db.mycol.insert( {"name":"張笑笑"} )
WriteResult({ "nInserted" : 1 })
> db.mycol.insert({"name1":"張笑笑1"})
WriteResult({ "nInserted" : 1 })
> db.mycol.insert({"name2":"張笑笑2"})
WriteResult({ "nInserted" : 1 })
> db.mycol.insert({"name3":"張笑笑3"})
WriteResult({ "nInserted" : 1 })
> db.mycol.find()     # 查看現有的文檔
{ "_id" : ObjectId("5e73967dbd4667d1d9261ccc"), "name" : "張笑笑" }
{ "_id" : ObjectId("5e73968ebd4667d1d9261ccd"), "name1" : "張笑笑1" }
{ "_id" : ObjectId("5e739699bd4667d1d9261cce"), "name2" : "張笑笑2" }
{ "_id" : ObjectId("5e7396a0bd4667d1d9261ccf"), "name3" : "張笑笑3" }
# 繼續插入文檔
> db.mycol.insert({"name4":"張笑笑4"})
WriteResult({ "nInserted" : 1 })
> db.mycol.insert({"name5":"張笑笑5"})
WriteResult({ "nInserted" : 1 })
> db.mycol.find()      # 會發現,當文檔數超過定義的max值,就會覆蓋掉最舊的數據,也就是插入的第一條數據
{ "_id" : ObjectId("5e73968ebd4667d1d9261ccd"), "name1" : "張笑笑1" }
{ "_id" : ObjectId("5e739699bd4667d1d9261cce"), "name2" : "張笑笑2" }
{ "_id" : ObjectId("5e7396a0bd4667d1d9261ccf"), "name3" : "張笑笑" }
{ "_id" : ObjectId("5e7396d5bd4667d1d9261cd0"), "name4" : "張笑笑" }
{ "_id" : ObjectId("5e7396e1bd4667d1d9261cd1"), "name5" : "張笑笑5" }

在mongodb中,咱們不須要建立集合,當咱們插入一些文檔時,mongodb會自動建立集合,以下:

> db.mycol2.insert({"name":"I need a job"})    # 插入數據
WriteResult({ "nInserted" : 1 })
> show collections     # 查看集合
mycol2
> db.mycol2.find()    # 查看集合內容
{ "_id" : ObjectId("5e7434b7fc41de8da910239c"), "name" : "I need a job" }

mongodb刪除集合
語法格式以下:

> db.collection.drop()

返回值:
若是成功刪除選定集合,則drop()方法返回true,不然返回false
示例:

> show collections    # 查看當前集合
mycol2
> db.mycol2.drop()    # 刪除集合
true
> show collections     # 再次查看就沒有集合了

插入文檔
語法:

db.COLLECTION_NAME.insert(document)

示例:
插入文檔第一種方法
第一種方法是直接插入文檔

> db.col.insert( { title: "學習mongodb的次日",
... description: "mongodb是一個nosql數據庫",
... by: "網上文檔",
... url: "cn.bing.com",
... tags: ['mongodb','nosql','databases'],
... likes: 100
... } )
> db.col.find()    # 查看col集合中的文檔以下
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "學習mongodb的次日", "description" : "mongodb是一個nosql數據庫", "by" : "網上文檔", "url" : "cn.bing.com", "tags" : [ "mongodb", "nosql", "databases" ], "likes" : 100 }

插入文檔第二種方法
第二種方式是將文檔定義爲變量再進行插入

# 定義變量document
> document=({title: 'MongoDB', 
... description: 'MongoDB 是一個 Nosql 數據庫',
... by: 'cainiao',
... url: 'http://cn.bing.com',
... tags: ['mongodb', 'database', 'NoSQL'],
... likes: 100
... });

# 執行插入操做

> db.mycol.insert(document)
# 查看插入後的文檔數據
> db.mycol.find()
{ "_id" : ObjectId("5e743a2ffc41de8da910239e"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

注:插入文檔也可使用db.col.save(document)指令,若是不指定_id字段,save方法相似於insert()方法,若是指定_id字段,則會更新該_id的數據。

更新文檔數據
update()方法

update()方法用於更新已存在的文檔,語法:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)

參數說明:

  • query:update的查詢條件,相似於sql查詢定義的where條件。
  • update:updat的對象和一些更新的操做符(如$,$inc…)等,也能夠理解爲sql查詢set指令定義的。
  • upsert: 可選參數,做用:若是不存在update的記錄,是否插入爲新的對象,true爲插入,默認爲false,不插入。
  • multi:可選,mongodb默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查找的多條記錄所有更新。
  • writeconcern:可選,拋出異常的級別。

示例:

> db.col.find()   # 查看集合現有內容
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "學習mongodb的次日", "description" : "mongodb是一個nosql數據庫", "by" : "網上文檔", "url" : "cn.bing.com", "tags" : [ "mongodb", "nosql", "databases" ], "likes" : 100 }
# 執行更新操做
> db.col.update( {'title': '學習mongodb的次日'},{$set:{'title':'mongodb'}})
> db.col.find()    # 更新內容成功
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "mongodb", "description" : "mongodb是一個nosql數據庫", "by" : "網上文檔", "url" : "cn.bing.com", "tags" : [ "mongodb", "nosql", "databases" ], "likes" : 100 }

能夠看到title由原來的’學習mongodb的次日’更新爲’mongodb’。
以上語句只會修改第一條發現的文檔,若是要修改多條相同的文檔,則須要設置multi參數爲true。以下:

db.col.update( {'title': '學習mongodb的次日'},{$set:{'title':'mongodb'}},{multi:true})

更多實例
只更新第一條記錄:

# 條件爲:count字段的值大於1,就將test2字段更新爲ok,默認只更新匹配到的第一條
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

所有更新:

# 條件爲:count字段的值大於1,就將test2字段更新爲ok,第一個false爲upsert的值參數,第二個true爲multi的取值參數。
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

後面的參考前面的解釋便可。關鍵點也就是在於後面兩條true和false的取值。
只添加第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

所有添加進去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

所有更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一條記錄:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

save()方法
save()方法經過傳入的文檔來替換已有文檔。
語法:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)

參數說明:

  • document:文檔數據。
  • writeConcern:可選,拋出異常的級別。

示例:

> db.col.find()    # 查看現有數據
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "mongodb", "description" : "mongodb是一個nosql數據庫", "by" : "網上文檔", "url" : "cn.bing.com", "tags" : [ "mongodb", "nosql", "databases" ], "likes" : 100 }
# 使用save更新數據
> db.col.find()    # id號必須和現有的id號一致,不然會生成新的文檔,而不是更新文檔
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "MongoDB", "description" : "mongodb shi yi ge nosql databases", "by" : "runoob", "url" : "http://cn.bing.com", "tags" : [ "mongo", "nosql" ], "like" : 110 }

# 查看更新後的數據
> db.col.find()
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "MongoDB", "description" : "mongodb shi yi ge nosql databases", "by" : "runoob", "url" : "http://cn.bing.com", "tags" : [ "mongo", "nosql" ], "like" : 110 }

刪除文檔
remove方法

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)

參數說明:

  • query:可選,刪除文檔的條件。
  • justone:可選,若是設爲true或1,則只刪除1個文檔,若是不設置該參數,或使用默認值false,則刪除全部匹配條件的文檔。
  • writeConcern:可選,拋出異常的級別。

示例:

> db.col.find()     # 查詢現有文檔
{ "_id" : ObjectId("5e7438d8fc41de8da910239d"), "title" : "MongoDB", "description" : "mongodb shi yi ge nosql databases", "by" : "runoob", "url" : "http://cn.bing.com", "tags" : [ "mongo", "nosql" ], "like" : 110 }
{ "_id" : ObjectId("7f8538d8fc41de8da910239d"), "title" : "MongoDB", "description" : "mongodb shi yi ge nosql databases", "by" : "runoob", "url" : "http://cn.bing.com", "tags" : [ "mongo", "nosql" ], "like" : 110 }
# 刪除title爲MongoDB的文檔:
> db.col.remove( {'title':'MongoDB'} )
WriteResult({ "nRemoved" : 2 })   # 返回結果顯示刪除了兩條數據
> db.col.find()    # 再次查看已經沒有數據了
# 若是隻想是刪除第一條找到的記錄,能夠設置 justOne 爲 1,以下:
# 刪除title爲MongoDB的文檔,只刪除匹配到的第一個文檔:
> db.col.remove( {'title':'MongoDB'},1 )
# 若是想要刪除全部數據,可使用如下方式(相似sql中的truncate指令)。
> db.col.remove({}

deleteOne() 和 deleteMany()
不過mongodb通過這麼長時間的發展,remove()方法已通過時了,如今官方推薦 deleteOne() 和 deleteMany() 方法。
示例:
注:下面示例中的col是集合名稱。

# 刪除links等於100的文檔
> db.col.deleteOne({likes: 100})
# 刪除集合下所有文檔
> db.col.deleteMany({})
{ "acknowledged" : true, "deletedCount" : 2 }

查詢文檔
語法格式:

db.collection.find(query, projection).pretty()

選項說明:

  • query:可選,使用查詢操做符指定查詢條件。
  • projection:可選,使用投影操做符指定返回的值,查詢時返回文檔中全部鍵值,只需神略該參數便可(默認省略).
  • pretty():以易讀的方式來讀取數據。

示例:

> db.my.find().pretty()    # 以人性化的方式輸出my集合中的文檔
{
    "_id" : ObjectId("5e75929087edb46897838e76"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "cainiao",
    "url" : "http://cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}

mongodb與sql的where語句比較

操做 格式 範例 sql中的相似語句
等於 {:} db.col.find({「by」:」cainiao」}).pretty() where by = ‘菜鳥教程’
小於 {:{$lt:}} db.col.find({「likes」:{$lt:50}}).pretty() where likes < 50
小於或等於 {:{$lte:}} db.col.find({「likes」:{$lte:50}}).pretty() where likes <= 50
大於 {:{$gt:}} db.col.find({「likes」:{$gt:50}}).pretty() where likes > 50
大於或等於 {:{$gte:}} db.col.find({「likes」:{$gte:50}}).pretty() where likes >= 50
不等於 {:{$ne:}} db.col.find({「likes」:{$ne:50}}).pretty() where likes != 50

mongodb and 條件
語法格式以下:

>db.col.find({key1:value1, key2:value2}).pretty()

在花括號{ }中傳入多個key,每一個key以逗號隔開,就是and條件。
以下:

# 查找likes值爲110而且by的值爲cainiao的文檔。
> db.my.find({"likes":110,"by":"cainiao"}).pretty()    
{
    "_id" : ObjectId("5e75932387edb46897838e77"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "cainiao",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 110
}
# 以上的語句相似於sql中的「where likes=110 and by='cainiao'」。

mongodb or條件

or條件爲或關係,語法格式:
>db.col.find(
   {
      $or: [
         {key1: value1}, {key2:value2}
      ]
   }
).pretty()

示例:

# 查看文檔中likes值爲110或者by的值爲「cainiao」的文檔。
> db.my.find( {  $or:[  {"likes":110},{"by":"cainiao"}  ] } ).pretty()
{
    "_id" : ObjectId("5e75929087edb46897838e76"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "cainiao",
    "url" : "http://cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
{
    "_id" : ObjectId("5e75932387edb46897838e77"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "cainiao",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 110
}

and和or聯合使用
如下示例相似於sql語句中的:「where likes>100 and (by=’cainiao’ or by = ‘ray’)」

# 查找likes值大於100而且by的值爲cainiao或者ray。
> db.my.find({'likes':{$gt:100}, $or:[ {"by":"cainiao"},{"by":"ray"}]}).pretty()
{
    "_id" : ObjectId("5e75932387edb46897838e77"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "cainiao",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 110
}
{
    "_id" : ObjectId("5e75933987edb46897838e78"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "ray",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 150
}

mongodb排序
在mongodb中使用sort()方法對數據進行排序,sort()方法能夠經過參數指定排序的字段,而且使用1(升序)和-1(降序)來指定排序的方式。
語法格式:

>db.COLLECTION_NAME.find().sort({KEY:1})

示例:

# 查詢列表中的數據以下:
> db.my.find()
{ "_id" : ObjectId("5e75929087edb46897838e76"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "cainiao", "url" : "http://cn.bing.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5e75932387edb46897838e77"), "title" : "Mongodb", "description" : "MongoDB是一個 Nosql數據庫", "by" : "cainiao", "url" : "cn.bing.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 110 }
{ "_id" : ObjectId("5e75933987edb46897838e78"), "title" : "Mongodb", "description" : "MongoDB是一個 Nosql數據庫", "by" : "ray", "url" : "cn.bing.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 150 }
{ "_id" : ObjectId("5e75a81e87edb46897838e79"), "title" : "Mongodb", "description" : "MongoDB是一個 Nosql數據庫", "by" : "ray", "url" : "cn.bing.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 88 }

# 以升序來進行排序
> db.my.find().sort({"likes":1}).pretty()
{
    "_id" : ObjectId("5e75a81e87edb46897838e79"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "ray",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 88
}
{
    "_id" : ObjectId("5e75929087edb46897838e76"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "cainiao",
    "url" : "http://cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
{
    "_id" : ObjectId("5e75932387edb46897838e77"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "cainiao",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 110
}
{
    "_id" : ObjectId("5e75933987edb46897838e78"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "ray",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 150
}

# 以降序來進行排序
> db.my.find().sort({"likes":-1}).pretty()
{
    "_id" : ObjectId("5e75933987edb46897838e78"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "ray",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 150
}
{
    "_id" : ObjectId("5e75932387edb46897838e77"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "cainiao",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 110
}
{
    "_id" : ObjectId("5e75929087edb46897838e76"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 數據庫",
    "by" : "cainiao",
    "url" : "http://cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
{
    "_id" : ObjectId("5e75a81e87edb46897838e79"),
    "title" : "Mongodb",
    "description" : "MongoDB是一個 Nosql數據庫",
    "by" : "ray",
    "url" : "cn.bing.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 88
}

mongodb索引
索引至關於書籍中的目錄,若是沒有索引,mongodb在讀取數據時必須掃描集合中的每一個文檔並選取那些符合查詢條件的記錄。

這種掃描全集合的查詢效率不但浪費系統的資源,並且效率低下,特別是在處理大量的數據時,查詢可能要花費幾十秒甚至幾分鐘,這是致命的問題。

索引是一種特殊的數據結構,它存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構。
語法
createIndex()方法基本語法格式以下:

>db.collection.createIndex(keys, options)

語法中 Key 值爲要建立的索引字段,1爲指定按升序建立索引,-1則爲降序建立索引。
示例:

> db.my.createIndex({"title":1})

createIndex()方法中也能夠設置使用多個字段建立索引(關係性數據庫中稱做複合索引)。

> db.my.createIndex({"by":1,"likes":-1})

createIndex()接受可選參數,可選參數列表以下:

Parameter Type Description
background Boolean 建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 「background」 可選參數。 「background」 默認值爲false。
unique Boolean 創建的索引是否惟一。指定爲true建立惟一索引。默認值爲false.
name string 索引的名稱。若是未指定,MongoDB的經過鏈接索引的字段名和排序順序生成一個索引名稱。
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.my.createIndex({"name":1,"url":1},{background: true})

mongodb聚合索引
MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。

aggregate()方法
MongoDB中聚合的方法使用aggregate()。
語法:

>db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

示例:

集合中的數據以下:

> db.data.find().pretty()
{
    "_id" : ObjectId("5e75b50287edb46897838e7a"),
    "title" : "MongoDB Overview",
    "description" : "MongoDB is no sql database",
    "by_user" : "runoob.com",
    "url" : "http://www.runoob.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
{
    "_id" : ObjectId("5e75b50287edb46897838e7b"),
    "title" : "NoSQL Overview",
    "description" : "No sql database is very fast",
    "by_user" : "runoob.com",
    "url" : "http://www.runoob.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 10
}
{
    "_id" : ObjectId("5e75b50287edb46897838e7c"),
    "title" : "Neo4j Overview",
    "description" : "Neo4j is no sql database",
    "by_user" : "Neo4j",
    "url" : "http://www.neo4j.com",
    "tags" : [
        "neo4j",
        "database",
        "NoSQL"
    ],
    "likes" : 750
}

如今經過以上集合計算每一個做者所寫的文章數,使用aggregate()計算結果以下:

# 注:下面的_id爲固定字段。

> db.data.aggregate([{$group:{_id:"$by_user",numbser:{$sum:1}}}])
{ "_id" : "runoob.com", "numbser" : 2 }    # 做者爲runoob.com的文章數爲2
{ "_id" : "Neo4j", "numbser" : 1 }   # 做者爲neo4j的文章數爲1

在上面的例子中,經過字段 by_user 字段對數據進行分組,並計算 by_user 字段相同值的總和。
上述示例中相似於sql語句:

select by_user, count(*) from mycol group by 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中的管道
管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的參數。

MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。

表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。

聚合框架中經常使用的幾個操做:

  • $project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
  • $match:用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操做。
  • $limit:用來限制MongoDB聚合管道返回的文檔數。
  • $skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
  • $unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
  • $group:將集合中的文檔分組,可用於統計結果。
  • $sort:將輸入文檔排序後輸出。
  • $geoNear:輸出接近某一地理位置的有序文檔。

示例:
$project

#
> db.data.aggregate({$project:{title:1,by_user:1,}}).pretty()
{
    "_id" : ObjectId("5e75b50287edb46897838e7a"),
    "title" : "MongoDB Overview",
    "by_user" : "runoob.com"
}
{
    "_id" : ObjectId("5e75b50287edb46897838e7b"),
    "title" : "NoSQL Overview",
    "by_user" : "runoob.com"
}
{
    "_id" : ObjectId("5e75b50287edb46897838e7c"),
    "title" : "Neo4j Overview",
    "by_user" : "Neo4j"
}
# 通過$project管道操做,結果中就只有"_id"、"title"、"by_user"三個字段了(默認包含_id字段)。
# 若是不想包含_id字段能夠這樣:
> db.data.aggregate({$project:{_id:0,title:1,by_user:1}})
{ "title" : "MongoDB Overview", "by_user" : "runoob.com" }
{ "title" : "NoSQL Overview", "by_user" : "runoob.com" }
{ "title" : "Neo4j Overview", "by_user" : "Neo4j" }

$match
data集合數據以下:

> db.data.find()    # 查看現有數據
{ "_id" : ObjectId("5e75b50287edb46897838e7a"), "title" : "MongoDB Overview", "description" : "MongoDB is no sql database", "by_user" : "runoob.com", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5e75b50287edb46897838e7b"), "title" : "NoSQL Overview", "description" : "No sql database is very fast", "by_user" : "runoob.com", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 10 }
{ "_id" : ObjectId("5e75b50287edb46897838e7c"), "title" : "Neo4j Overview", "description" : "Neo4j is no sql database", "by_user" : "Neo4j", "url" : "http://www.neo4j.com", "tags" : [ "neo4j", "database", "NoSQL" ], "likes" : 750 }

$skip示例

> db.data.aggregate({$skip:2}).pretty()   # 跳過集合中的前兩個文檔,而後開始輸出
{
    "_id" : ObjectId("5e75b50287edb46897838e7c"),
    "title" : "Neo4j Overview",
    "description" : "Neo4j is no sql database",
    "by_user" : "Neo4j",
    "url" : "http://www.neo4j.com",
    "tags" : [
        "neo4j",
        "database",
        "NoSQL"
    ],
    "likes" : 750
}

通過$skip管道操做符處理後,前2個文檔被」過濾」掉。
$limit示例
$limit用於限制返回的文檔數

> db.data.aggregate({$limit:2}).pretty()        # 限制的值爲2,因此只能返回2個文檔內容。
{
    "_id" : ObjectId("5e75b50287edb46897838e7a"),
    "title" : "MongoDB Overview",
    "description" : "MongoDB is no sql database",
    "by_user" : "runoob.com",
    "url" : "http://www.runoob.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 100
}
{
    "_id" : ObjectId("5e75b50287edb46897838e7b"),
    "title" : "NoSQL Overview",
    "description" : "No sql database is very fast",
    "by_user" : "runoob.com",
    "url" : "http://www.runoob.com",
    "tags" : [
        "mongodb",
        "database",
        "NoSQL"
    ],
    "likes" : 10
}
相關文章
相關標籤/搜索