MongoDB學(xué)習(xí)筆記

Mongo

MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫予借。由C++語言編寫。旨在為WEB應(yīng)用提供可擴(kuò)展的高性能數(shù)據(jù)存儲解決方案挤土。

MongoDB 是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品眯亦,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的辫秧。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散束倍,是類似json的bson格式,因此可以存儲比較復(fù)雜的數(shù)據(jù)類型盟戏。Mongo最大的特點(diǎn)是他支持的查詢語言非常強(qiáng)大绪妹,其語法有點(diǎn)類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實(shí)現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能柿究,而且還支持對數(shù)據(jù)建立索引邮旷。、

入門

安裝Mongo

windows安裝

http://www.runoob.com/mongodb/mongodb-window-install.html

linux安裝

https://www.cnblogs.com/pfnie/articles/6759105.html

基本操作

創(chuàng)建數(shù)據(jù)庫
use DATABASE_NAME   創(chuàng)建/切換數(shù)據(jù)庫
查看當(dāng)前所在庫
db  查看當(dāng)前所在庫
查看所有庫
show dbs    查看所有庫
刪除db
db.dropDatabase()   刪除庫(先進(jìn)入庫use dbname)
創(chuàng)建集合(表)
db.createCollection("tableName")
createCollection四個參數(shù):

capped(布爾型):

如果為 true蝇摸,則創(chuàng)建固定集合婶肩。固定集合是指有著固定大小的集合,當(dāng)達(dá)到最大值時貌夕,它會自動覆蓋最早的文檔律歼。當(dāng)該值為 true 時,必須指定 size 參數(shù)啡专。

autoIndexId(布爾型):

如為 true险毁,自動在 _id 字段創(chuàng)建索引。默認(rèn)為 false们童。

size(數(shù)值型):

為固定集合指定一個最大值(以字節(jié)計(jì))畔况。如果 capped 為 true,也需要指定該字段病附。

max(數(shù)值型):

指定固定集合中包含文檔的最大數(shù)量问窃。

例子:

db.createCollection(
    "tablename1", 
    { 
        capped : true, 
        autoIndexId : true, 
        size :  6142800,
        max : 10000 
    } 
)
刪除集合(表)
db.tableName.drop()
顯示當(dāng)前db狀態(tài)
db.stats(); 
當(dāng)前db版本
db.version(); 
查看命令提示
db.help();  db.tableName.help();  db.tableName.find().help();  

增刪改查

插入文檔

db.tableName.insert()

例子:

db.user.insert({ "name" : "zhangsan", "age" : 15})

查詢文檔

db.tableName.find()
兩個參數(shù):

query 條件

例子:

db.tableName.find({"name":"zhangsan"})

projection 返回文檔的信息(返回的列)

例子:

db.tableName.find({"name":"zhangsan"}, {"name":0, "age":1})

注意:值只有0和1,1表示顯示項(xiàng)完沪,0表示不顯示項(xiàng)

條件操作符
sql 語義 mongo 列子
> 大于 $gt db.tableName.find({"age":{$gt:15}})
< 小于 $lt
>= 大于等于 $gte
!= 不等于 $ne
in 在...里面 $in db.tableName.find({"name":{"$in":["zhangsan","lisi"]}})
or 或者 $or db.tableName.find({"gender": "boy", $or: [{"name": "zhangsan"})
$type操作符
類型 代號值
Double 1
String 2
Object 3
Array 4
Binary data 6
Object id 7
Boolean 8
Date 9
Null 10
JavaScript 13
模糊查詢
正則匹配:

$regex
例子:

db.tableName.find({"name":{$regex:"zhang"}})

刪除文檔

db.tableName.remove(
   <query>,
   <justOne>
)

uery :(可選)刪除的文檔的條件域庇。
justOne : (可選)如果設(shè)為 true 或 1嵌戈,則只刪除一個文檔。

例子:

db.tableName.remove({"name":"zhangsan"})

更新文檔

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

query : update的查詢條件听皿,類似sql update查詢內(nèi)where后面的熟呛。

update : update的對象和一些更新的操作符,也可以理解為sql update查詢內(nèi)set后面的尉姨。(https://blog.csdn.net/sunnyyoona/article/details/52420210)

upsert : 可選庵朝,這個參數(shù)的意思是,如果不存在update的記錄又厉,是否插入objNew,true為插入九府,默認(rèn)是false,不插入覆致。
multi : 可選侄旬,mongodb 默認(rèn)是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新煌妈。
writeConcern : 可選儡羔,拋出異常的級別。

例子:

db.tableName.update({"name":"zhangsan"}, {"name":"wangwu", age:18})

分頁排序

分頁
limit與skip

limit(number) 讀取指定數(shù)量數(shù)據(jù)

例子:

db.tableName.find().limit(2)  顯示兩條數(shù)據(jù)

skip(number) 跳過指定數(shù)量的數(shù)據(jù)

例子:

db.tableName.find().skip(2)  跳過前面兩條數(shù)據(jù)璧诵,從第三條開始讀取
排序

sort({KEY:1})

例子:

db.tableName.find().sort({"age" : -1}) 1升-1降

注意:skip(), limilt(), sort()三個放在一起執(zhí)行的時候汰蜘,執(zhí)行的順序是先 sort(), 然后是 skip(),最后是limit()之宿。

索引

查看索引

getIndexes()            方法可以用來查看集合的所有索引
totalIndexSize()        查看集合索引的總大小

創(chuàng)建索引

字段索引
db.tableName.ensureIndex({KEY:1}, {options})

例子:

db.tableName.ensureIndex({"name" : 1})

keys族操,要建立索引的參數(shù)列表。如:{KEY:1}澈缺,其中key表示字段名坪创,1表示升序排序,也可使用使用數(shù)字-1降序姐赡。

options莱预,可選參數(shù),表示建立索引的設(shè)置项滑∫谰冢可選值如下:

參數(shù) 類型 描述
background Boolean 在后臺建立索引,以便建立索引時不阻止其他數(shù)據(jù)庫活動枪狂,默認(rèn)值 false
unique Boolean 創(chuàng)建唯一索引危喉,默認(rèn)值 false
name String 指定索引的名稱,如果未指定州疾,MongoDB會生成一個索引字段的名稱和排序順序串聯(lián)辜限,名字長度限制為125字節(jié)
dropDups Boolean 創(chuàng)建唯一索引時,如果出現(xiàn)重復(fù)刪除后續(xù)出現(xiàn)的相同索引诲祸,只保留第一個
sparse Boolean 對文檔中不存在的字段數(shù)據(jù)不啟用索引,默認(rèn)值是 false
v index version 索引的版本號
weights document 索引權(quán)重值八回,數(shù)值在 1 到 99,999 之間毫深,表示該索引相對于其他索引字段的得分權(quán)重
復(fù)合索引

復(fù)合索引也稱多字段索引

db.tableName.ensureIndex({"name":1,"age":-1})
多鍵索引

多鍵索引與單鍵索引創(chuàng)建形式相同,區(qū)別在于字段的值.值具有多個記錄,例如數(shù)組吩坝。

db.tableName.insert({x:[1,2,3,4]})
過期索引

過期索引只能建立在時間類型上(時間數(shù)組也行,數(shù)字是以最小時間為標(biāo)準(zhǔn))哑蔫,不能使用時間戳钉寝;不能是復(fù)合索引;刪除時間不是非常精確(刪除也需要時間)闸迷。

db.tableName.ensureIndex({"time":1},{expireAfterSeconds:10})
db.zhoucl.insert({"name":"zhangsan"+50, "age":14, "gender":"難","time":new Date()})
//插入數(shù)據(jù)十秒后將被刪除
全文索引(文本索引)

能解決快速文本查找的需求嵌纲,每張表只允許創(chuàng)建一個全文索引;全文索引只能指定一個$text稿黍;

普通全文索引
db.tableName.ensureIndex({"key":"text"})
多列全文索引
db.tableName.ensureIndex({"key":"text", "key2":"text"})
所有列
db.tableName.ensureIndex({"$**":"text"})

查詢指定關(guān)鍵字:{"$search" : "查詢關(guān)鍵字"}

查詢多個關(guān)鍵字(或關(guān)系):{"$search" : "查詢關(guān)鍵字 查詢關(guān)鍵字 ......"}

查詢多個關(guān)鍵字(與關(guān)系):{"$search" : ""查詢關(guān)鍵字" "查詢關(guān)鍵字" ......"}  # "轉(zhuǎn)義字符

排除多個關(guān)鍵字(排除某一個):{"$search" : ""查詢關(guān)鍵字" "查詢關(guān)鍵字"...... - 排除關(guān)鍵字"}

相似度查詢
db.tableName.find({$text:{$search:"aa bb"}}, {score:{$meta:"textSore"}}})
排序  
db.tableName.find({$text:{$search:"aa"}}, {score:{$meta:"textScore"}}).sort({score:{$meta:"textScore"}})
其他類型索引

哈希索引(Hashed Index) 是指按照某個字段的hash值來建立索引疹瘦,目前主要用于MongoDB Sharded

Cluster的Hash分片崩哩,hash索引只能滿足字段完全匹配的查詢巡球,不能滿足范圍查詢等。

地理位置索引(Geospatial Index)能很好的解決O2O的應(yīng)用場景邓嘹,比如『查找附近的美食』酣栈、『查找某個區(qū)域內(nèi)的車站』等。

聚合

aggregate主要用于處理數(shù)據(jù)(諸如統(tǒng)計(jì)平均值,求和等)汹押,并返回計(jì)算后的數(shù)據(jù)結(jié)果矿筝。

aggregate()是基于數(shù)據(jù)處理的聚合管道,每個文檔通過一個由多個階段(stage)組成的管道棚贾,可以對每個階段的管道進(jìn)行分組窖维、過濾等功能,然后經(jīng)過一系列的處理妙痹,輸出相應(yīng)的結(jié)果铸史。Mongo還提供了一些聚合函數(shù)如:count(),distinct()怯伊。

語法:

 db.collection.aggregate(pipeline, options)

gourp聚合:

group做的聚合有些復(fù)雜琳轿。先選定分組所依據(jù)的鍵,此后MongoDB就會將集合依據(jù)選定鍵值的不同分成若干組耿芹。然后可以通過聚合每一組內(nèi)的文檔崭篡,產(chǎn)生一個結(jié)果文檔。

$group聚合相關(guān)表達(dá)式:
表達(dá)式 描述 實(shí)例
$sum 計(jì)算總和 db.mycol.aggregate([{group : {_id : "by_user", num_tutorial : {sum : "likes"}}}])
$avg 計(jì)算平均值 db.tableName.aggregate([{group : {_id : "by_user", num_tutorial : {avg : "likes"}}}])
$min 獲取集合中所有文檔對應(yīng)值得最小值 db.tableName.aggregate([{group : {_id : "by_user", num_tutorial : {min : "likes"}}}])
$max 獲取集合中所有文檔對應(yīng)值得最大值 db.tableName.aggregate([{group : {_id : "by_user", num_tutorial : {max : "likes"}}}])
$push 在結(jié)果文檔中插入值到一個數(shù)組中 db.tableName.aggregate([{group : {_id : "by_user", url : {push: "url"}}}])
$addToSet 在結(jié)果文檔中插入值到一個數(shù)組中吧秕,但不創(chuàng)建副本 db.tableName.aggregate([{group : {_id : "by_user", url : {addToSet : "url"}}}])
$first 根據(jù)資源文檔的排序獲取第一個文檔數(shù)據(jù) db.tableName.aggregate([{group : {_id : "by_user", first_url : {first : "url"}}}])
$last 根據(jù)資源文檔的排序獲取最后一個文檔數(shù)據(jù) db.tableName.aggregate([{group : {_id : "by_user", last_url : {last : "url"}}}])
例子1:

數(shù)據(jù)如下:

{_id: 1, 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: 2, 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: 3, title: 'Neo4j Overview',  description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 }

聚合函數(shù)如下:

db.tableName.aggregate(
        [
            { 
                $group : {
                    _id : "$by_user", 
                    num_tutorial : {
                        $sum : 1
                    }
                }
            }
        ]
    )

結(jié)果如下:

{ "_id" : "runoob.com", "num_tutorial" : 2}
{ "_id" : "Neo4j", "num_tutorial" : 1}
例子2:

數(shù)據(jù)如下:

{ "_id" : 1, "item" : "abc", "price" : 10, "quantity" : 2, "date" : ISODate("2014-03-01T08:00:00Z") }
    
{ "_id" : 2, "item" : "jkl", "price" : 20, "quantity" : 1, "date" : ISODate("2014-03-01T09:00:00Z") }
    
{ "_id" : 3, "item" : "xyz", "price" : 5, "quantity" : 10, "date" : ISODate("2014-03-15T09:00:00Z") }
    
{ "_id" : 4, "item" : "xyz", "price" : 5, "quantity" : 20, "date" : ISODate("2014-04-04T11:21:39.736Z") }
    
{ "_id" : 5, "item" : "abc", "price" : 10, "quantity" : 10, "date" : ISODate("2014-04-04T21:23:13.331Z") }

聚合函數(shù)如下:

db.tableName.aggregate([
      {
        $group : {
           _id : { month: { $month: "$date" }, day: { $dayOfMonth: "$date" }, year: { $year: "$date" } },
           totalPrice: { $sum: { $multiply: [ "$price", "$quantity" ] } },
           averageQuantity: { $avg: "$quantity" },
           count: { $sum: 1 }
        }
      }
   ]
)

結(jié)果如下:

{ "_id" : { "month" : 3, "day" : 15, "year" : 2014 }, "totalPrice" : 50, "averageQuantity" : 10, "count" : 1 }
{ "_id" : { "month" : 4, "day" : 4, "year" : 2014 }, "totalPrice" : 200, "averageQuantity" : 15, "count" : 2 }
{ "_id" : { "month" : 3, "day" : 1, "year" : 2014 }, "totalPrice" : 40, "averageQuantity" : 1.5, "count" : 2 }

其他聚合:

count
db.tableName.find().count() 統(tǒng)計(jì)總數(shù)
distinct
db.collection_name.distinct(field,query,options) 去重復(fù)

管道

MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結(jié)果傳遞給下一個管道處理琉闪。管道操作是可以重復(fù)的。

管道表達(dá)式:
表達(dá)式 描述
$project 修改輸入文檔的結(jié)構(gòu)砸彬〉弑校可以用來重命名疗涉、增加或刪除域,也可以用于創(chuàng)建計(jì)算結(jié)果以及嵌套文檔
$match 用于過濾數(shù)據(jù)吟秩,只輸出符合條件的文檔咱扣。$match使用MongoDB的標(biāo)準(zhǔn)查詢操作
$limit 用來限制MongoDB聚合管道返回的文檔數(shù)
$skip 在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔
$unwind 將文檔中的某一個數(shù)組類型字段拆分成多條涵防,每條包含數(shù)組中的一個值
$group 將集合中的文檔分組闹伪,可用于統(tǒng)計(jì)結(jié)果
$sort 將輸入文檔排序后輸出
$geoNear 輸出接近某一地理位置的有序文檔
例子:
db.test.aggregate(
        [
            { 
                $group : {
                    _id : "$by_user", 
                    num_tutorial : {
                        $sum : 1
                    }
                }
            },
            { $skip : 1 }
        ]
    )
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市壮池,隨后出現(xiàn)的幾起案子偏瓤,更是在濱河造成了極大的恐慌,老刑警劉巖椰憋,帶你破解...
    沈念sama閱讀 217,185評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件厅克,死亡現(xiàn)場離奇詭異,居然都是意外死亡橙依,警方通過查閱死者的電腦和手機(jī)证舟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,652評論 3 393
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窗骑,“玉大人女责,你說我怎么就攤上這事〈匆耄” “怎么了抵知?”我有些...
    開封第一講書人閱讀 163,524評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長软族。 經(jīng)常有香客問我刷喜,道長,這世上最難降的妖魔是什么立砸? 我笑而不...
    開封第一講書人閱讀 58,339評論 1 293
  • 正文 為了忘掉前任掖疮,我火速辦了婚禮,結(jié)果婚禮上仰禽,老公的妹妹穿的比我還像新娘氮墨。我一直安慰自己,他們只是感情好吐葵,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,387評論 6 391
  • 文/花漫 我一把揭開白布规揪。 她就那樣靜靜地躺著,像睡著了一般温峭。 火紅的嫁衣襯著肌膚如雪猛铅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,287評論 1 301
  • 那天凤藏,我揣著相機(jī)與錄音奸忽,去河邊找鬼堕伪。 笑死,一個胖子當(dāng)著我的面吹牛栗菜,可吹牛的內(nèi)容都是我干的欠雌。 我是一名探鬼主播,決...
    沈念sama閱讀 40,130評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼疙筹,長吁一口氣:“原來是場噩夢啊……” “哼富俄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起而咆,我...
    開封第一講書人閱讀 38,985評論 0 275
  • 序言:老撾萬榮一對情侶失蹤霍比,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后暴备,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體悠瞬,經(jīng)...
    沈念sama閱讀 45,420評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,617評論 3 334
  • 正文 我和宋清朗相戀三年涯捻,在試婚紗的時候發(fā)現(xiàn)自己被綠了浅妆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,779評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡汰瘫,死狀恐怖狂打,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情混弥,我是刑警寧澤,帶...
    沈念sama閱讀 35,477評論 5 345
  • 正文 年R本政府宣布对省,位于F島的核電站蝗拿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蒿涎。R本人自食惡果不足惜哀托,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,088評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望劳秋。 院中可真熱鬧仓手,春花似錦、人聲如沸玻淑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,716評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽补履。三九已至添坊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間箫锤,已是汗流浹背贬蛙。 一陣腳步聲響...
    開封第一講書人閱讀 32,857評論 1 269
  • 我被黑心中介騙來泰國打工雨女, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阳准。 一個月前我還...
    沈念sama閱讀 47,876評論 2 370
  • 正文 我出身青樓氛堕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親野蝇。 傳聞我的和親對象是個殘疾皇子岔擂,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,700評論 2 354

推薦閱讀更多精彩內(nèi)容

  • MongoDB 基本概念 數(shù)據(jù)庫 MongoDB一個數(shù)據(jù)庫包括多個集合,類似于MySQL中一個數(shù)據(jù)庫包含多個表浪耘;一...
    唔代閱讀 968評論 0 0
  • mongodb 深入學(xué)習(xí)筆記 mongodb基本知識 mongodb是介于關(guān)系型數(shù)據(jù)庫與非關(guān)系型數(shù)據(jù)庫之間的NoS...
    深思海數(shù)_willschang閱讀 970評論 0 1
  • mongoDB簡介 MongoDB是用C++語言編寫的非關(guān)系型數(shù)據(jù)庫乱灵。特點(diǎn)是高性能、易部署七冲、易使用痛倚,存儲數(shù)據(jù)十分方...
    AubreyXue閱讀 659評論 2 3
  • Windows上的安裝方法: 下載,安裝澜躺,可以從customer自定義安裝路徑后蝉稳,例如我設(shè)置的安裝路徑為"F:\M...
    cccshuang閱讀 198評論 0 1
  • MongoDB常用操作 一、查詢 find方法 查詢所有的結(jié)果: select * from users;===d...
    止風(fēng)者閱讀 603評論 1 3