傳統(tǒng)數(shù)據(jù)庫(kù)中,我們要操作數(shù)據(jù)庫(kù)數(shù)據(jù)都要書(shū)寫(xiě)大量的sql語(yǔ)句覆享,而且在進(jìn)行無(wú)規(guī)則數(shù)據(jù)的存儲(chǔ)時(shí)佳遂,傳統(tǒng)關(guān)系型數(shù)據(jù)庫(kù)建表時(shí)對(duì)不同字段的處理也顯得有些乏力,mongo應(yīng)運(yùn)而生防嗡,而且ajax技術(shù)的廣泛應(yīng)用惹苗,json格式的廣泛接受纵诞,也使得mongo更貼近開(kāi)發(fā)人員也殖。
mongo簡(jiǎn)介及應(yīng)用場(chǎng)景
MongoDB是一個(gè)面向文檔的非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)徘熔,使用json格式存儲(chǔ)荚藻。Mongo DB很好的實(shí)現(xiàn)了面向?qū)ο蟮乃枷?OO思想),在Mongo DB中 每一條記錄都是一個(gè)Document對(duì)象斋竞。Mongo DB最大的優(yōu)勢(shì)在于所有的數(shù)據(jù)持久操作都無(wú)需開(kāi)發(fā)人員手動(dòng)編寫(xiě)SQL語(yǔ)句,直接調(diào)用方法就可以輕松的實(shí)現(xiàn)CRUD操作章姓。
mongo能應(yīng)用在如下場(chǎng)景:
存儲(chǔ)大尺寸拧抖、低價(jià)值的數(shù)據(jù)json及對(duì)象類(lèi)型數(shù)據(jù)網(wǎng)站緩存數(shù)據(jù)評(píng)論祟峦、子評(píng)論類(lèi)有明顯從屬關(guān)系數(shù)據(jù)多服務(wù)器數(shù)據(jù),其內(nèi)置的MapReduce很容易現(xiàn)實(shí)全局遍歷徙鱼。
主要功能特性:
- 文件存儲(chǔ)格式BSON(一種json的擴(kuò)展)
- 模式自由 數(shù)據(jù)格式不受限了表的結(jié)構(gòu)
- 支持動(dòng)態(tài)查詢(xún)
- 支持完全索引
- 支持復(fù)制(其主從復(fù)制)和故障恢復(fù)
- 使用高效的二進(jìn)制數(shù)據(jù)存儲(chǔ)宅楞,包括大型對(duì)象
- 自動(dòng)處理碎片,以支持云計(jì)算層次的擴(kuò)展袱吆。
- 支持Java厌衙、Ruby、Python绞绒、C++婶希、PHP等多種語(yǔ)言
- 內(nèi)部支持Javascript
MongoDB的優(yōu)勢(shì)
1.查詢(xún)速度快
2.高并發(fā)∨詈猓可以達(dá)到2萬(wàn)個(gè)并發(fā)喻杈。
3.高容量彤枢。支持10TB意思的數(shù)據(jù)量 MongoDB
使用場(chǎng)景
1.網(wǎng)站數(shù)據(jù)
2.緩存
3.大尺寸、低價(jià)值的數(shù)據(jù)
4.高伸縮的場(chǎng)景
5.用于對(duì)象以及Json數(shù)據(jù)存儲(chǔ)
mongoDB是介于nosql和sql之間的數(shù)據(jù)庫(kù)筒饰。
NoSQL 數(shù)據(jù)庫(kù)分類(lèi)
類(lèi)型 | 部分代表 | 特點(diǎn) |
---|---|---|
列存儲(chǔ) | HbaseCassandraHypertable | 顧名思義缴啡,是按列存儲(chǔ)數(shù)據(jù)的。最大的特點(diǎn)是方便存儲(chǔ)結(jié)構(gòu)化和半結(jié)構(gòu)化數(shù)據(jù)瓷们,方便做數(shù)據(jù)壓縮业栅,對(duì)針對(duì)某一列或者某幾列的查詢(xún)有非常大的IO優(yōu)勢(shì)。 |
文檔存儲(chǔ) | MongoDBCouchDB | 文檔存儲(chǔ)一般用類(lèi)似json的格式存儲(chǔ)谬晕,存儲(chǔ)的內(nèi)容是文檔型的碘裕。這樣也就有有機(jī)會(huì)對(duì)某些字段建立索引,實(shí)現(xiàn)關(guān)系數(shù)據(jù)庫(kù)的某些功能攒钳。 |
key-value存儲(chǔ) | Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis | 可以通過(guò)key快速查詢(xún)到其value帮孔。一般來(lái)說(shuō),存儲(chǔ)不管value的格式不撑,照單全收你弦。(Redis包含了其他功能) |
圖存儲(chǔ) | Neo4JFlockDB | 圖形關(guān)系的最佳存儲(chǔ)。使用傳統(tǒng)關(guān)系數(shù)據(jù)庫(kù)來(lái)解決的話性能低下燎孟,而且設(shè)計(jì)使用不方便禽作。 |
對(duì)象存儲(chǔ) | db4oVersant | 通過(guò)類(lèi)似面向?qū)ο笳Z(yǔ)言的語(yǔ)法操作數(shù)據(jù)庫(kù),通過(guò)對(duì)象的方式存取數(shù)據(jù)揩页。 |
xml數(shù)據(jù)庫(kù) | Berkeley DB XMLBaseX | 高效的存儲(chǔ)XML數(shù)據(jù)旷偿,并支持XML的內(nèi)部查詢(xún)語(yǔ)法,比如XQuery,Xpath爆侣。 |
MongoDB與其他數(shù)據(jù)庫(kù)區(qū)別
對(duì)比項(xiàng) | MONGODB | MYSQL萍程、ORACLE |
---|---|---|
數(shù)據(jù)庫(kù) | 數(shù)據(jù)庫(kù)(dataBase) | 數(shù)據(jù)庫(kù)(dataBase,schema) |
表 | 集合(collections) | 二維表(table) |
表中的一行數(shù)據(jù) | 文檔(document) | 一行記錄(record) |
表字段 | 鍵(key) | 列(column) |
主外鍵 | 無(wú) | primary key,Forigen key |
靈活度擴(kuò)展項(xiàng) | 極高 | 差(結(jié)構(gòu)化數(shù)據(jù)) |
安裝和使用mongodb
我們?cè)诠倬W(wǎng) https://www.mongodb.org/ 上可以下載到其最新穩(wěn)定版本 ,mongo是官方已經(jīng)編譯好的兔仰,解壓后即可使用其命令都在bin目錄下茫负。
使用前首先配置mongo.conf文件
port=xxxxx //代表端口號(hào),如果不指定則默認(rèn)為 27017
dbpath=/usr/local/mongodb/db //數(shù)據(jù)庫(kù)路徑
logpath=/usr/local/mongodb/logs/mongodb.log //日志路徑
logappend=true //日志文件自動(dòng)累加乎赴,而不是覆蓋
fork=ture //以守護(hù)進(jìn)程方式創(chuàng)建
數(shù)據(jù)庫(kù)和數(shù)據(jù)表都可以直接創(chuàng)建忍法,即不用切換,直接使用榕吼,使用時(shí)即創(chuàng)建饿序,mongo里還可以直接寫(xiě)js腳本,可直接運(yùn)行羹蚣,mongo中如果不指定_id字段原探,mongo會(huì)自動(dòng)添加一個(gè)。
mongo的各種命令
mongo的命令是其精髓,這些十分復(fù)雜的命令集合在一塊咽弦,使得mongo的查詢(xún)變得絢麗而高效徒蟆。mongo內(nèi)的每個(gè)表稱(chēng)作一個(gè)collection(集合),使用命令類(lèi)似于MySQL型型,切換到數(shù)據(jù)庫(kù)內(nèi)直接對(duì)每一個(gè)collection操作段审。其命令由方法(func())、查詢(xún)體(寫(xiě)在{}里)和操作符(由$開(kāi)頭)組成输莺。
基本命令
show dbs //查看數(shù)據(jù)庫(kù)
use dbname //切換到數(shù)據(jù)庫(kù)
db.createCollection('collection') //創(chuàng)建數(shù)據(jù)表
db.collection.drop() //刪除數(shù)據(jù)表
db.dropDatabase() //刪數(shù)據(jù)庫(kù)
db.collection.insert({data}) //插入數(shù)據(jù)
db.collection.find() //顯示數(shù)據(jù)表內(nèi)全部?jī)?nèi)容
查詢(xún)體
{key.attr.attr:value} //普通式
{key:{$ne|$gt|$gte|$lt|$lte|$in|$nin|$all:value}} //key滿(mǎn)足 $oper value的值
{$or|$and|$not|$nor:[{key1:{$gt:value}},{key2:{$ne:value}}]} //用$oper同時(shí)限定key1,key2的條件
{key:{$mod{8,2}}} //取出key對(duì)8取余為2的值。
{key:{$exist:1}} //取出key列存在的值裸诽。
{key:{$type:String|Double|Array|Date|Object|Boolean|......}}//查詢(xún)key類(lèi)型為type的列
{key:{$regex:/pattern/}} //通過(guò)正則查詢(xún)嫂用,效率較低
{$where:'this.attr.express.....'} //直接用where語(yǔ)句,二進(jìn)制轉(zhuǎn)為JS運(yùn)算丈冬,較慢
find()方法增強(qiáng)
db.collection.find(query,{要取出的列:1,不需要的列:0})
db.collection.find(query).skip(跳過(guò)的行數(shù)).limit(限制信息條數(shù));
db.collection.find(query).explain() //與MYSQL的解釋語(yǔ)句一樣嘱函。
db.collection.remove(query,[justone]) //如不指定query,全部刪除;[justone]默認(rèn)為false意思是查詢(xún)到多個(gè)埂蕊,但只刪一個(gè)往弓。
update語(yǔ)句
db.collection.update(query,{key:newvalue}) //注意:新值會(huì)覆蓋舊值,即數(shù)據(jù)只剩下語(yǔ)句中定義的key
db.collection.update(query,
{
$set:{key:newvalue},
$unset:{key:value},
$rename:{key:value},
$inc:{key:value},
......
},
{
multi:true, //改變所有符合條件的,默認(rèn)為false
upsert:true //沒(méi)有的話剛添加蓄氧,默認(rèn)為false
}
)
游標(biāo)
var cursorName=db.collection.fund(query,...)[.skip(num).limit(num)] //創(chuàng)建游標(biāo)
cursorName.hasNext() //判斷是否有下一個(gè)
printjson(cursorName.next()) //輸出游標(biāo)的下一個(gè)指向值
cursorName.forEach(function(Obj){process Obj}) //遍歷操作游標(biāo)
索引
db.collection.getIndexes() //查看索引
db.collection.ensureIndex({key:1/-1[,key.attr:1/-1]},{unique:1(是否唯一)},{sparse:1(是否非空)})// 添加正序/倒序索引
db.collection.dropIndex({key:1/2}) //刪除索引
db.collection.reIndex() //重建用了很多出現(xiàn)雜亂的索引
MapReduce
MapReduce是mongo中內(nèi)置的一個(gè)非常強(qiáng)大的遍歷操作工具函似,使用它需要實(shí)現(xiàn)它的map和reduce兩個(gè)函數(shù)
db.runCommand(
{
mapReduce: collection, //要操作的數(shù)據(jù)表
map: function(){emit(key1,key2)}, //對(duì)key1和key2進(jìn)行數(shù)據(jù)映射
reduce: function(key,value){}, //對(duì)key值和數(shù)據(jù)組value進(jìn)行操作
out: <output>,
query: <document>,
sort: <document>,
limit: <number>,
finalize: <function>,
scope: <document>,
jsMode: <boolean>,
verbose: <boolean>
}
)
更多更詳細(xì)的命令可以在mongo的中文社區(qū) http://docs.mongoing.com/manual-zh/ 找到。
mongo的用戶(hù)喉童、數(shù)據(jù)導(dǎo)入導(dǎo)出和集群
用戶(hù)管理
MongoDB默認(rèn)不開(kāi)啟授權(quán)撇寞。可以在開(kāi)啟服務(wù)器時(shí)添加 --auth 或者 --keyFile 選項(xiàng)開(kāi)啟授權(quán)堂氯。使用配置文件的話蔑担,使用 security.authorization 或 security.keyFile 設(shè)置。
MongoDB提供 自帶角色, 每一個(gè)角色都為一種常見(jiàn)用例提供一個(gè)明確的作用咽白。例如 read, readWrite, dbAdmin, 和 root 等角色啤握。我們通過(guò)創(chuàng)建用戶(hù),創(chuàng)建角色晶框,給用戶(hù)分配/回收不同的角色來(lái)進(jìn)行用戶(hù)管理排抬。
添加角色時(shí)要先在admin數(shù)據(jù)庫(kù)中添加一個(gè)管理員角色,然后使用管理員角色在每個(gè)庫(kù)添加不同的角色授段。
use admin;(切換到admin數(shù)據(jù)庫(kù)畜埋,對(duì)此庫(kù)操作)
db.createUser(
{
user: "username",
pwd: "password",
roles:
[
{
role: "userAdminAnyDatabase",
db: "admin"
}
]
}
)
use database;
db.auth('username','passwd');用超級(jí)管理員用戶(hù)登陸后,整個(gè)mongo數(shù)據(jù)庫(kù)皆可存取畴蒲。
數(shù)據(jù)導(dǎo)入導(dǎo)出
我們使用mongo自帶的工具進(jìn)行導(dǎo)入導(dǎo)出悠鞍,在mongo/bin目錄下,最好導(dǎo)出csv格式,便于數(shù)據(jù)交換咖祭。
./mongoexport -d dataname -c tablename -f key1,key2 -q 'query' -o ainname --csv
//導(dǎo)出數(shù)據(jù)掩宜,默認(rèn)為json格式
./mongoimport -d dataname -c tablename --type json --file ./path
//導(dǎo)入數(shù)據(jù),默認(rèn)為json格式
mongo數(shù)據(jù)庫(kù)集群
打開(kāi)mongod時(shí)添加選項(xiàng) --replSet replname;
在mongo客戶(hù)端連接上一個(gè)mongod進(jìn)程么翰,進(jìn)入admin數(shù)據(jù)庫(kù)牺汤,然后聲明mongoconf變量:
use admin;
var rsconf={_id:'replname',members[{_id:0,host:'xxx'},{_id:1,host:'xxy'}]};
用rs.initiatee(rsconf);來(lái)初始化集群,mongo會(huì)自動(dòng)將id號(hào)小的設(shè)為primary,其他的mongod進(jìn)程為secondary浩嫌。
連接secondary進(jìn)程檐迟,使用slaveOk()函數(shù),來(lái)初始化從進(jìn)程码耐。
PHP中操作mongo數(shù)據(jù)庫(kù)
我們先為php添加mongo擴(kuò)展追迟。然后,我們便可以在腳本中使用mongo類(lèi)函數(shù)庫(kù)了骚腥。
不同于其他的類(lèi)庫(kù)只有一個(gè)核心類(lèi)敦间,mongo有四個(gè)類(lèi),分別是:
Mongo類(lèi)束铭,基礎(chǔ)類(lèi)廓块,擁有連接、關(guān)閉連接契沫、對(duì)全局?jǐn)?shù)據(jù)庫(kù)的操作方法带猴。mongoDB類(lèi),由Mongo類(lèi)通過(guò)selectDB()方法得到懈万,擁有表級(jí)的操作方法浓利。MongoCollection類(lèi),一般由Mongo->dbname->collection或直接用MongoDB類(lèi)和數(shù)據(jù)庫(kù)名實(shí)例化得到钞速,擁有對(duì)數(shù)據(jù)的基本操作贷掖。MongoCursor類(lèi),由MongoCollection通過(guò)find()方法得到渴语,擁有普通的游標(biāo)遍歷操作苹威。
以下是一個(gè)典型的mongo操作:
$mongo=new Mongo();
$mongo->connect('host',port);
$collection=$mongo->dbname->collection;
$cursor=$collection->find();
$cursor->operate();
$mongo->close();
python中操作mongo數(shù)據(jù)庫(kù)
安裝
pip install pymongo
使用
In [1]: from pymongo import MongoClient
In [2]: m = MongoClient(host="127.0.0.1",port=27017)
In [3]: db = m.youdi
In [4]: col = youdi.col
In [7]: for i in col.find():
...: print(i)
In [8]: dir(col)
Out[8]:
['_BaseObject__codec_options',
'_BaseObject__read_concern',
'_BaseObject__read_preference',
'_BaseObject__write_concern',
'_Collection__create',
'_Collection__create_index',
'_Collection__database',
'_Collection__find_and_modify',
'_Collection__full_name',
'_Collection__name',
'_Collection__write_response_codec_options',
'__call__',
'__class__',
'__delattr__',
'__dict__',
'__dir__',
'__doc__',
'__eq__',
'__format__',
'__ge__',
'__getattr__',
'__getattribute__',
'__getitem__',
'__gt__',
'__hash__',
'__init__',
'__init_subclass__',
'__iter__',
'__le__',
'__lt__',
'__module__',
'__ne__',
'__new__',
'__next__',
'__reduce__',
'__reduce_ex__',
'__repr__',
'__setattr__',
'__sizeof__',
'__str__',
'__subclasshook__',
'__weakref__',
'_aggregate',
'_command',
'_count',
'_delete',
'_delete_retryable',
'_insert',
'_insert_one',
'_legacy_write',
'_socket_for_primary_reads',
'_socket_for_reads',
'_socket_for_writes',
'_update',
'_update_retryable',
'aggregate',
'aggregate_raw_batches',
'bulk_write',
'codec_options',
'count',
'create_index',
'create_indexes',
'database',
'delete_many',
'delete_one',
'distinct',
'drop',
'drop_index',
'drop_indexes',
'ensure_index',
'find',
'find_and_modify',
'find_one',
'find_one_and_delete',
'find_one_and_replace',
'find_one_and_update',
'find_raw_batches',
'full_name',
'group',
'index_information',
'initialize_ordered_bulk_op',
'initialize_unordered_bulk_op',
'inline_map_reduce',
'insert',
'insert_many',
'insert_one',
'list_indexes',
'map_reduce',
'name',
'next',
'options',
'parallel_scan',
'read_concern',
'read_preference',
'reindex',
'remove',
'rename',
'replace_one',
'save',
'update',
'update_many',
'update_one',
'watch',
'with_options',
'write_concern']