- 論壇徽章:
- 0
|
NoSQL介紹及MongoDB入門
本文是一篇轉載文章,作者先是談到了自己對NoSQL的認識,后面一部分更有MongoDB在命令行客戶端下的各種操作。概念性與實用性并重。
原文鏈接:http://wuyoudao.org/blog/2010/06/nosql_and_mongodb_intro/
寫在前面
本文是由一次演講整理出來的,文中大部分資料來源于網(wǎng)絡,感謝Wikipedia,Google和MongoDB官網(wǎng)。文中使用的MongoDB版本為1.2.4。
What is NoSQL
NoSQL一詞首先是Carlo Strozzi在1998年提出來的,指的是他開發(fā)的一個沒有SQL功能,輕量級的,開源的關系型數(shù)據(jù)庫。注意,這個定義跟我們現(xiàn)在對NoSQL的定義有很大的區(qū)別,它確確實實字如其名,指的就是“沒有SQL”的數(shù)據(jù)庫。不過,NoSQL的發(fā)展慢慢偏離了初衷,Carlo Strozzi也發(fā)覺,其實我們要的不是”no sql”,而應該是”no relational”,也就是我們現(xiàn)在常說的非關系型數(shù)據(jù)庫了。
2009年初,Johan Oskarsson舉辦了一場關于開源分布式數(shù)據(jù)庫的討論,Eric Evans在這次討論中再次提出了NoSQL一詞,用于指代那些非關系型的,分布式的,且一般不保證遵循ACID原則的數(shù)據(jù)儲存系統(tǒng)的出現(xiàn)和興起。Eric Evans使用NoSQL這個詞,并不是因為字面上的“沒有SQL”的意思,他只是覺得很多經(jīng)典的關系型數(shù)據(jù)庫名字都叫”**SQL”(例如MySQL,MS SQL,PostgreSQL),所以為了表示跟這些關系型數(shù)據(jù)庫在定位上的截然不同,就用了”NoSQL”一詞。
Wikipedia上對NoSQL的定義是這樣的:NoSQL是一項運動,這個運動推動了廣義定義的非關系型數(shù)據(jù)儲存系統(tǒng)的發(fā)展,并破除了長久以來關系型數(shù)據(jù)庫一家獨大的局面。論文和研究中一般將這些數(shù)據(jù)庫稱為結構化儲存系統(tǒng)。
為什么NoSQL變得流行
**上robbin的一篇文章(為什么要用非關系數(shù)據(jù)庫?)很好地討論了這個問題,這里只列出幾個要點。
對數(shù)據(jù)庫的“三高”需求
高并發(fā)讀寫
對海量數(shù)據(jù)的高效率讀寫
高擴展性和高可用性
關系型數(shù)據(jù)庫的特性地位下降
事務一致性
讀寫實時性
復雜SQL,特別是多表關聯(lián)查詢
What is MongoDB
MongoDB是一個面向文檔的數(shù)據(jù)庫系統(tǒng)。使用C++編寫,不支持SQL,但有自己功能強大的查詢語法。MongoDB使用BSON作為數(shù)據(jù)存儲和傳輸?shù)母袷。BSON是一種類似JSON的二進制序列化文檔,支持嵌套對象和數(shù)組。MongoDB很像MySQL,document對應MySQL的row,collection對應MySQL的table。
MongoDB在Windows上的安裝運行很方便。直接下載、解壓,然后運行 bin/mongod 即可啟動服務器,運行 bin/mongo 即可運行命令行客戶端。更多關于MongoDB的運行看這里。MongoDB命令行客戶端的腳本語法有些類似MySQL的:
show dbs // 列出所有數(shù)據(jù)庫
use memo // 使用數(shù)據(jù)庫memo。即使這個數(shù)據(jù)庫不存在也可以執(zhí)行,但該數(shù)據(jù)庫不會立刻被新建,要等到執(zhí)行了insert之類的操作時,才會建立這個數(shù)據(jù)庫
show collections // 列出當前數(shù)據(jù)庫的collections
db // 顯示當前數(shù)據(jù)庫
show users // 列出用戶MongoDB的查詢語法很強大。例如,很多SQL可以做的,它都可以做:
coll.find() // select * from coll
coll.find().limit(10) // select * from coll limit 10
coll.find().sort({x:1}) // select * from coll order by x asc
coll.find().sort({x:1}).skip(5).limit(10) // select * from coll order by x asc limit 5, 10
coll.find({x:10}) // select * from coll where x = 10
coll.find({x: {$lt:10}}) // select * from coll where x <= 10
coll.find({}, {y:true}) // select y from coll一些SQL不能做的,MongoDB也可以做:
coll.find({"address.city":"gz"}) // 搜索嵌套文檔address中city值為gz的記錄
coll.find({likes:"math"}) // 搜索數(shù)組
coll.ensureIndex({"address.city":1}) // 在嵌套文檔的字段上建索引索引:
coll.ensureIndex({productid:1}) // 在productid上建立普通索引
coll.ensureIndex({district:1, plate:1}) // 多字段索引
coll.ensureIndex({productid:1}, {unique:true}) // 唯一索引
coll.ensureIndex({productid:1}, {unique:true, dropDups:true|) // 建索引時,如果遇到索引字段值已經(jīng)出現(xiàn)過的情況,則刪除重復記錄
coll.getIndexes() // 查看索引
coll.dropIndex({productid:1}) // 刪除單個索引安全與認證(該版本的MongoDB僅支持很基本的安全策略):
use shine // 如果要root權限,就用admin庫
db.addUser("username", "password") // 普通權限,可讀寫
db.addUser("username", "password", true) // 只可讀,不可寫
db.system.users.remove({user: username}) // 刪除用戶數(shù)據(jù)導出、導入:
// json或csv格式,每次一個collection
mongoexport -d producttrade -c basic -o /home/data/mongo_backup/producttrade_100504.json
mongoimport -d producttrade -c basic --drop /home/data/mongo_backup/producttrade_100504.json
// 二進制數(shù)據(jù)格式,常用于備份、還原
mongodump -d shine -o /home/data/mongo_backup
mongorestore -d shine --drop /home/data/mongo_backup/shineMongoDB in Java
到這里下一個MongoDB的Java驅(qū)動,把jar包扔到項目里去就行了。上面提到的通過腳本操作的功能,基本上都能在Java中找到實現(xiàn)。進行數(shù)據(jù)庫連接的代碼也十分簡潔:
Mongo mongo = new Mongo();
db = mongo.getDB("shine");
coll = db.getCollection("producttrade");
DBCursor cur = coll.find();
// 對cur進行操作。。。啰啰嗦嗦
每個BSON對象大小不能超過4MB。MongoDB使用GridFS來儲存大文件。
字段名限制:不能以”$”開頭;不能包含”.”;”_id”是系統(tǒng)保留的字段,但用戶可以自己儲存唯一性的數(shù)據(jù)在字段中。
MongoDB為每個數(shù)據(jù)庫分配一系列文件。每個數(shù)據(jù)文件都會被預分配一個大小,第一個文件名字為”.0″,大小為64MB,第二個文件”.1″為128MB,依此類推,文件大小上限為2GB。
MongoDB沒有新建數(shù)據(jù)庫或者collection的命令,只要進行insert或其它操作,MongoDB就會自動幫你建立數(shù)據(jù)庫和collection。當查詢一個不存在的collection時也不會出錯,Mongo會認為那是一個空的collection。
一個對象被插入到數(shù)據(jù)庫中時,如果它沒有ID,會自動生成一個”_id”字段,為24位16進制數(shù)。
Java中,Mongo對象是線程安全的,一個應用中應該只使用一個Mongo對象。Mongo對象會自動維護一個連接池,默認連接數(shù)為10。
|
|