天天看點

MongoDB簡易教程mongo簡介及應用場景安裝和使用mongodbPHP中操作mongo資料庫python中操作mongo資料庫

傳統資料庫中,我們要操作資料庫資料都要書寫大量的sql語句,而且在進行無規則資料的存儲時,傳統關系型資料庫建表時對不同字段的處理也顯得有些乏力,mongo應運而生,而且ajax技術的廣泛應用,json格式的廣泛接受,也使得mongo更貼近開發人員。

mongo簡介及應用場景

MongoDB是一個面向文檔的非關系型資料庫(NoSQL),使用json格式存儲。Mongo DB很好的實作了面向對象的思想(OO思想),在Mongo DB中 每一條記錄都是一個Document對象。Mongo DB最大的優勢在于所有的資料持久操作都無需開發人員手動編寫SQL語句,直接調用方法就可以輕松的實作CRUD操作。

mongo能應用在如下場景:

存儲大尺寸、低價值的資料json及對象類型資料網站緩存資料評論、子評論類有明顯從屬關系資料多伺服器資料,其内置的MapReduce很容易現實全局周遊。

主要功能特性:

  1. 檔案存儲格式BSON(一種json的擴充)
  2. 模式自由 資料格式不受限了表的結構
  3. 支援動态查詢
  4. 支援完全索引
  5. 支援複制(其主從複制)和故障恢複
  6. 使用高效的二進制資料存儲,包括大型對象
  7. 自動處理碎片,以支援雲計算層次的擴充。
  8. 支援Java、Ruby、Python、C++、PHP等多種語言
  9. 内部支援Javascript

MongoDB的優勢

1.查詢速度快

2.高并發。可以達到2萬個并發。

3.高容量。支援10TB意思的資料量 MongoDB

使用場景

1.網站資料

2.緩存

3.大尺寸、低價值的資料

4.高伸縮的場景

5.用于對象以及Json資料存儲

mongoDB是介于nosql和sql之間的資料庫。

NoSQL 資料庫分類

類型 部分代表 特點
列存儲 HbaseCassandraHypertable 顧名思義,是按列存儲資料的。最大的特點是友善存儲結構化和半結構化資料,友善做資料壓縮,對針對某一列或者某幾列的查詢有非常大的IO優勢。
文檔存儲 MongoDBCouchDB 文檔存儲一般用類似json的格式存儲,存儲的内容是文檔型的。這樣也就有有機會對某些字段建立索引,實作關系資料庫的某些功能。
key-value存儲 Tokyo Cabinet / TyrantBerkeley DBMemcacheDBRedis 可以通過key快速查詢到其value。一般來說,存儲不管value的格式,照單全收。(Redis包含了其他功能)
圖存儲 Neo4JFlockDB 圖形關系的最佳存儲。使用傳統關系資料庫來解決的話性能低下,而且設計使用不友善。
對象存儲 db4oVersant 通過類似面向對象語言的文法操作資料庫,通過對象的方式存取資料。
xml資料庫 Berkeley DB XMLBaseX 高效的存儲XML資料,并支援XML的内部查詢文法,比如XQuery,Xpath。

MongoDB與其他資料庫差別

對比項 MONGODB MYSQL、ORACLE
資料庫 資料庫(dataBase) 資料庫(dataBase,schema)
集合(collections) 二維表(table)
表中的一行資料 文檔(document) 一行記錄(record)
表字段 鍵(key) 列(column)
主外鍵 primary key,Forigen key
靈活度擴充項 極高 差(結構化資料)

安裝和使用mongodb

我們在官網

https://www.mongodb.org/

上可以下載下傳到其最新穩定版本 ,mongo是官方已經編譯好的,解壓後即可使用其指令都在bin目錄下。

使用前首先配置mongo.conf檔案

port=xxxxx         //代表端口号,如果不指定則預設為 27017 
dbpath=/usr/local/mongodb/db    //資料庫路徑
logpath=/usr/local/mongodb/logs/mongodb.log //日志路徑
logappend=true        //日志檔案自動累加,而不是覆寫
fork=ture         //以守護程序方式建立
           

資料庫和資料表都可以直接建立,即不用切換,直接使用,使用時即建立,mongo裡還可以直接寫js腳本,可直接運作,mongo中如果不指定_id字段,mongo會自動添加一個。

mongo的各種指令

mongo的指令是其精髓,這些十分複雜的指令集合在一塊,使得mongo的查詢變得絢麗而高效。mongo内的每個表稱作一個collection(集合),使用指令類似于MySQL,切換到資料庫内直接對每一個collection操作。其指令由方法(func())、查詢體(寫在{}裡)和操作符(由$開頭)組成。

基本指令

show dbs        //檢視資料庫
use dbname        //切換到資料庫
db.createCollection('collection')  //建立資料表
db.collection.drop()     //删除資料表
db.dropDatabase()      //删資料庫
db.collection.insert({data})   //插入資料
db.collection.find()     //顯示資料表内全部内容
           

查詢體

{key.attr.attr:value}          //普通式
{key:{$ne|$gt|$gte|$lt|$lte|$in|$nin|$all:value}}   //key滿足 $oper value的值
{$or|$and|$not|$nor:[{key1:{$gt:value}},{key2:{$ne:value}}]} //用$oper同時限定key1,key2的條件
{key:{$mod{8,2}}}           //取出key對8取餘為2的值。
{key:{$exist:1}}           //取出key列存在的值。
{key:{$type:String|Double|Array|Date|Object|Boolean|......}}//查詢key類型為type的列
{key:{$regex:/pattern/}}         //通過正則查詢,效率較低
{$where:'this.attr.express.....'}       //直接用where語句,二進制轉為JS運算,較慢
           

find()方法增強

db.collection.find(query,{要取出的列:1,不需要的列:0})  
db.collection.find(query).skip(跳過的行數).limit(限制資訊條數);
db.collection.find(query).explain()   //與MYSQL的解釋語句一樣。
db.collection.remove(query,[justone]) //如不指定query,全部删除;[justone]預設為false意思是查詢到多個,但隻删一個。
           

update語句

db.collection.update(query,{key:newvalue}) //注意:新值會覆寫舊值,即資料隻剩下語句中定義的key
db.collection.update(query,
{
 $set:{key:newvalue},
 $unset:{key:value},
 $rename:{key:value},
 $inc:{key:value},
 ......
},
{
 multi:true,  //改變所有符合條件的,預設為false
 upsert:true  //沒有的話剛添加,預設為false
}
)
           

遊标

var cursorName=db.collection.fund(query,...)[.skip(num).limit(num)] //建立遊标
cursorName.hasNext()            //判斷是否有下一個
printjson(cursorName.next())          //輸出遊标的下一個指向值
cursorName.forEach(function(Obj){process Obj})      //周遊操作遊标
           

索引

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()   //重建用了很多出現雜亂的索引
           

MapReduce

MapReduce是mongo中内置的一個非常強大的周遊操作工具,使用它需要實作它的map和reduce兩個函數

db.runCommand(
 {
 mapReduce: collection,    //要操作的資料表
 map: function(){emit(key1,key2)}, //對key1和key2進行資料映射
 reduce: function(key,value){},  //對key值和資料組value進行操作
 out: <output>,
 query: <document>,
 sort: <document>,
 limit: <number>,
 finalize: <function>,
 scope: <document>,
 jsMode: <boolean>,
 verbose: <boolean>
 }
)
           

更多更詳細的指令可以在mongo的中文社群

http://docs.mongoing.com/manual-zh/

找到。

mongo的使用者、資料導入導出和叢集

使用者管理

MongoDB預設不開啟授權。可以在開啟伺服器時添加 --auth 或者 --keyFile 選項開啟授權。使用配置檔案的話,使用 security.authorization 或 security.keyFile 設定。

MongoDB提供 自帶角色, 每一個角色都為一種常見用例提供一個明确的作用。例如 read, readWrite, dbAdmin, 和 root 等角色。我們通過建立使用者,建立角色,給使用者配置設定/回收不同的角色來進行使用者管理。

添加角色時要先在admin資料庫中添加一個管理者角色,然後使用管理者角色在每個庫添加不同的角色。

use admin;(切換到admin資料庫,對此庫操作)
db.createUser(
 {
 user: "username",
 pwd: "password",
 roles:
 [
 {
 role: "userAdminAnyDatabase",
 db: "admin"
 }
 ]
 }
)
use database;
db.auth('username','passwd');用超級管理者使用者登陸後,整個mongo資料庫皆可存取。
           

資料導入導出

我們使用mongo自帶的工具進行導入導出,在mongo/bin目錄下,最好導出csv格式,便于資料交換。

./mongoexport -d dataname -c tablename -f key1,key2 -q 'query' -o ainname --csv
//導出資料,預設為json格式
./mongoimport -d dataname -c tablename --type json --file ./path 
//導入資料,預設為json格式
           

mongo資料庫叢集

  1. 打開mongod時添加選項 --replSet replname;
  2. 在mongo用戶端連接配接上一個mongod程序,進入admin資料庫,然後聲明mongoconf變量:
use admin;
var rsconf={_id:'replname',members[{_id:0,host:'xxx'},{_id:1,host:'xxy'}]};
           
  1. 用rs.initiatee(rsconf);來初始化叢集,mongo會自動将id号小的設為primary,其他的mongod程序為secondary。
  2. 連接配接secondary程序,使用slaveOk()函數,來初始化從程序。

PHP中操作mongo資料庫

我們先為php添加mongo擴充。然後,我們便可以在腳本中使用mongo類函數庫了。

不同于其他的類庫隻有一個核心類,mongo有四個類,分别是:

Mongo類,基礎類,擁有連接配接、關閉連接配接、對全局資料庫的操作方法。mongoDB類,由Mongo類通過selectDB()方法得到,擁有表級的操作方法。MongoCollection類,一般由Mongo->dbname->collection或直接用MongoDB類和資料庫名執行個體化得到,擁有對資料的基本操作。MongoCursor類,由MongoCollection通過find()方法得到,擁有普通的遊标周遊操作。

以下是一個典型的mongo操作:

$mongo=new Mongo();
$mongo->connect('host',port);
$collection=$mongo->dbname->collection;
$cursor=$collection->find();
$cursor->operate();
$mongo->close();
           

python中操作mongo資料庫

安裝

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']