1. 程式人生 > >linger(心懷夢想,活在當下,知乎ID:linger liu)

linger(心懷夢想,活在當下,知乎ID:linger liu)

Mongodb雜談(一)

開始學習mongodb時,找一些中文部落格看。後來發現很多知識都搜不到,最後還是看官方網站和權威指南,還是這兩者靠譜,閒的時候可以多瀏覽一下。此文總結一下我入門學習mongodb的經驗。

Mongo shell操作mongodb

安裝完mongodb客戶端後,通過shelll來操作mongodb。我是在Ubuntu使用客戶端的,直接用apt-get來安裝,比較簡單。

方法1互動式(類似mysql)

連線格式mongo host:port/dbName –u userName –p password

[email protected]:~/data/test4$ mongo localhost:9019/admin–u linger –p 123123

show dbs;

show tables;

方法2指令碼式

mongo –nodb 進入mongo直譯器

> Master=new Mongo("localhost:9019")

connection to localhost:9019

> Mdb=Master.getDB("admin")

admin

> Mdb.auth("linger ","123123")

1

> Mdb.getCollectionNames()

[ "admin","system.indexes", "system.users", "test" ]

下面的連線方法也是可以的

Mdb =connect("localhost:9019/admin","linger ","123123")

方法3檔案指令碼式

mongo < test.js

test.js檔案內容

Master=new Mongo("localhost:9019")

Mdb=Master.getDB("admin")

Mdb.auth("linger","123123")

Mdb.getCollectionNames()

這裡用了輸入重定向的方法。

官網還介紹了一個執行js的方法,

mongo localhost:27017/test myjsfile.js

但是我感覺這樣不夠靈活,因為連線的主機ip和埠還有dbName寫在命令裡面。

互動式的方法,更像操作mysql那樣。

指令碼式的方法,更像程式語言那樣。

互動式和指令碼式一些命令的對照


簡單談談增刪改讀

mongodb以json格式處理資料的,

比如插入資料

db.testTable.insert({user:”linger”,”age”,”24”})

查詢資料

db.testData.find({user:"linger"})

關於增刪改讀的詳細資料可以參考一下資料

增刪改讀教程

增刪改讀API參考手冊

應用開發中mongodb的使用

Shell的方式操作mongodb,我覺得主要是管理mongodb的,這種方式做不了應用開發。

做應用開發時,我們得需要某種程式語言,然後通過mongodb的驅動來呼叫mongodb相關介面。

官網對驅動的描述是這樣子的

An application communicates with MongoDB by wayof a client library, called a driver, that handles all interaction with the database in alanguage appropriate to the application.

簡單來說就是,應用通過驅動跟mongodb互動。

驅動有官方提供的,也有第三方自己開發的。

下面這張圖是各語言對應的驅動


網上意外發現雲風大哥竟然自己開發了一套lua驅動。開始他想在C Drive做一層封裝,給lua呼叫,後來又從協議層實現了一份。我簡單瀏覽了一下程式碼,協議層是用C寫的,直接呼叫windows socket與server通訊,封裝好最基本的api,然後lua再呼叫C封裝成各種功能。

下面這段話來自他部落格

我曾經想在 C Driver 的基礎上做封裝。做的過程中發現 c driver 程式碼質量不高,且特性支援不完整,最終我考慮自己從協議層開始重新做一份。

mongo 的文件不算完整,我感覺協議定義也不是很嚴謹。所以在實現過程中遇到許多麻煩。原本認為一天能寫完的,結果做了三天。今天終於可以釋出一個初步的版本了。

MongoDB 的 Lua Driver

可以將mongodb當做hadoop的輸入輸出

MongoDB Connector for Hadoop

The MongoDB Connector for Hadoop is aplugin for Hadoop

that provides the ability to use MongoDB asan input source and/or an output destination.

http://docs.mongodb.org/ecosystem/tools/hadoop/

關於主從分離

Mongodb可以做主從的叢集,主叫primary或者master,從叫secondary或者slave。

值得注意的是secondary預設是不可讀寫的。

當時我連線了一臺secondary,想查但是出錯了。

Wed Dec 24 18:50:04.670 error: {"$err" : "not master and slaveOk=false", "code" :13435 } at src/mongo/shell/query.js:128

有兩種方法實現從機的查詢:

第一種方法:db.getMongo().setSlaveOk();

第二種方法:rs.slaveOk();

對於replica set 中的secondary 節點預設是不可讀的。

在寫多讀少的應用中,使用Replica Sets來實現讀寫分離。

通過在連線時指定或者在主庫指定slaveOk,

由Secondary來分擔讀的壓力,

Primary只承擔寫操作。

讓mongodb的secondary支援讀操作



Replication用來同步各server資料,可以用來做主從分離。

關於Sharding 

Sharding is a method for storing data acrossmultiple machines. MongoDB uses sharding to support deployments with very largedata sets and high throughput operations.

簡單來說,就是Sharding是在多臺機器儲存資料,起擴容的作用。



關於使用者許可權

管理員身份新新增的db,

管理員身份也是直接登入不了的,

得先登入到其他db,

再用use命令來切換到剛才的新增db。

如果想直接登入,要額外新增使用者並授權。

因此,我覺得使用者和密碼是對具體的一個db來說的,而不是對mongodb來說的。

給資料庫recsys新增一個使用者linger,並新增讀寫許可權。

db.addUser({user:"linger",pwd:"09388296",roles:["readWrite"]})

此處參考

額外參考資料:

MongoDB Scripting

本文連結:http://blog.csdn.net/lingerlanlan/article/details/42150611

本文作者:linger