本博文介紹了MongoDB,并詳細指引讀者在Ubuntu下MongoDB的安裝和使用。本教程在Ubuntu14.04下測試通過。
MongoDB 是一個是一個基于分布式文件存儲的數(shù)據(jù)庫,介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間,是非關(guān)系數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。他支持的數(shù)據(jù)結(jié)構(gòu)非常松散,是類似json的bson格式,因此可以存儲比較復雜的數(shù)據(jù)類型。Mongo最大的特點是他支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進行安裝。
打開終端,輸入以下命令:
sudo apt-get install mongodb
截圖如下:
mongo -version
輸出版本信息,表明安裝成功,截圖如下:
service mongodb startservice mongodb stop
截圖如下:
pgrep mongo -l #注意:-l是英文字母l,不是阿拉伯數(shù)字1
截圖如下:
sudo apt-get --purge remove mongodb mongodb-clients mongodb-server
輸入mongo
進入shell命令模式,默認連接的數(shù)據(jù)庫是test數(shù)據(jù)庫,在此之前一定要確保你已經(jīng)啟動了MongoDB,否則會出現(xiàn)錯誤,啟動之后運行成功,如下截圖:
數(shù)據(jù)庫相關(guān) show dbs
:顯示數(shù)據(jù)庫列表 show collections
:顯示當前數(shù)據(jù)庫中的集合(類似關(guān)系數(shù)據(jù)庫中的表table) show users
:顯示所有用戶 use yourDB
:切換當前數(shù)據(jù)庫至yourDB db.help()
:顯示數(shù)據(jù)庫操作命令 db.yourCollection.help()
:顯示集合操作命令,yourCollection是集合名
MongoDB沒有創(chuàng)建數(shù)據(jù)庫的命令,如果你想創(chuàng)建一個“School”的數(shù)據(jù)庫,先運行use School
命令,之后做一些操作(如:創(chuàng)建聚集集合db.createCollection('teacher')
),這樣就可以創(chuàng)建一個名叫“School”的數(shù)據(jù)庫。截圖如下:
use School #切換到School數(shù)據(jù)庫。MongoDB 無需預創(chuàng)建School數(shù)據(jù)庫,在使用時會自動創(chuàng)建
2、創(chuàng)建Collection
db.createCollection('teacher') #創(chuàng)建一個聚集集合。MongoDB 其實在插入數(shù)據(jù)的時候,也會自動創(chuàng)建對應(yīng)的集合,無需預定義集合
截圖如下:
db.student.insert({_id:1, sname: 'zhangsan', sage: 20}) #_id可選db.student.save({_id:1, sname: 'zhangsan', sage: 22}) #_id可選
這兩種方式,其插入的數(shù)據(jù)中_id字段均可不寫,會自動生成一個唯一的_id來標識本條數(shù)據(jù)。而insert和save不同之處在于:在手動插入_id字段時,如果_id已經(jīng)存在,insert不做操作,save做更新操作;如果不加_id字段,兩者作用相同都是插入數(shù)據(jù)。截圖如下:
db.youCollection.find(criteria, filterDisplay)
db.student.find() #查詢所有記錄。相當于:select * from studentdb.student.find({sname: 'lisi'}) #查詢sname='lisi'的記錄。相當于: select * from student where sname='lisi'db.student.find({},{sname:1, sage:1}) #查詢指定列sname、sage數(shù)據(jù)。相當于:select sname,sage from student。sname:1表示返回sname列,默認_id字段也是返回的,可以添加_id:0(意為不返回_id)寫成{sname: 1, sage: 1,_id:0},就不會返回默認的_id字段了db.student.find({sname: 'zhangsan', sage: 22}) #and 與條件查詢。相當于:select * from student where sname = 'zhangsan' and sage = 22db.student.find({$or: [{sage: 22}, {sage: 25}]}) #or 條件查詢。相當于:select * from student where sage = 22 or sage = 25
查詢操作類似,這里只給出db.student.find({sname: 'lisi'})
查詢的截圖,如下:
4、修改數(shù)據(jù) db.youCollection.update(criteria, objNew, upsert, multi )
criteria: update的查詢條件,類似sql update查詢內(nèi)where后面的
objNew : update的對象和一些更新的操作符(如$set
)等,也可以理解為sql update查詢內(nèi)set后面的。
upsert : 如果不存在update的記錄,是否插入objNew,true為插入,默認是false,不插入。
multi: mongodb默認是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。默認false,只修改匹配到的第一條數(shù)據(jù)。
其中criteria和objNew是必選參數(shù),upsert和multi可選參數(shù)
舉例如下:
db.student.update({sname: 'lisi'}, {$set: {sage: 30}}, false, true) #相當于:update student set sage =30 where sname = 'lisi';
操作截圖如下:
db.student.remove({sname: 'chenliu'}) #相當于:delete from student where sname='chenliu'
操作截圖如下:
exit
或者Ctrl C
退出shell命令模式注意:MongoDB相較安全性更偏向易用性,默認是沒有開啟用戶權(quán)限的,如果想開啟用戶權(quán)限,可以參考Ubuntu下開啟MongoDB用戶權(quán)限。
第一步:下載Java MongoDB Driver驅(qū)動jar包,Java MongoDB Driver下載地址,默認的下載目錄為~/下載或者~/Downloads
第二步:打開Eclipse,新建Java Project,新建Class,引入剛剛下載的jar包
第三步:編碼實現(xiàn)
下面是源代碼:
import java.util.ArrayList;import java.util.List;import org.bson.Document;import com.mongodb.MongoClient;import com.mongodb.client.MongoCollection;import com.mongodb.client.MongoCursor;import com.mongodb.client.MongoDatabase;import com.mongodb.client.model.Filters;public class TestMongoDB { /** * @param args */ public static void main(String[] args) { insert();//插入數(shù)據(jù)。執(zhí)行插入時,可將其他三句函數(shù)調(diào)用語句注釋掉,下同// find(); //查找數(shù)據(jù)// update();//更新數(shù)據(jù)// delete();//刪除數(shù)據(jù) } /** * 返回指定數(shù)據(jù)庫中的指定集合 * @param dbname 數(shù)據(jù)庫名 * @param collectionname 集合名 * @return */ //MongoDB無需預定義數(shù)據(jù)庫和集合,在使用的時候會自動創(chuàng)建 public static MongoCollection<Document> getCollection(String dbname,String collectionname){ //實例化一個mongo客戶端,服務(wù)器地址:localhost(本地),端口號:27017 MongoClient mongoClient=new MongoClient('localhost',27017); //實例化一個mongo數(shù)據(jù)庫 MongoDatabase mongoDatabase = mongoClient.getDatabase(dbname); //獲取數(shù)據(jù)庫中某個集合 MongoCollection<Document> collection = mongoDatabase.getCollection(collectionname); return collection; } /** * 插入數(shù)據(jù) */ public static void insert(){ try{ //連接MongoDB,指定連接數(shù)據(jù)庫名,指定連接表名。 MongoCollection<Document> collection= getCollection('test','student'); //實例化一個文檔,文檔內(nèi)容為{sname:'Mary',sage:25},如果還有其他字段,可以繼續(xù)追加append Document doc1=new Document('sname','Mary').append('sage', 25); //實例化一個文檔,文檔內(nèi)容為{sname:'Bob',sage:20} Document doc2=new Document('sname','Bob').append('sage', 20); List<Document> documents = new ArrayList<Document>(); //將doc1、doc2加入到documents列表中 documents.add(doc1); documents.add(doc2); //將documents插入集合 collection.insertMany(documents); System.out.println('插入成功'); }catch(Exception e){ System.err.println( e.getClass().getName() ': ' e.getMessage() ); } } /** * 查詢數(shù)據(jù) */ public static void find(){ try{ MongoCollection<Document> collection = getCollection('test','student'); //通過游標遍歷檢索出的文檔集合 // MongoCursor<Document> cursor= collection.find(new Document('sname','Mary')). projection(new Document('sname',1).append('sage',1).append('_id', 0)).iterator(); //find查詢條件:sname='Mary'。projection篩選:顯示sname和sage,不顯示_id(_id默認會顯示) //查詢所有數(shù)據(jù) MongoCursor<Document> cursor= collection.find().iterator(); while(cursor.hasNext()){ System.out.println(cursor.next().toJson()); } }catch(Exception e){ System.err.println( e.getClass().getName() ': ' e.getMessage() ); } } /** * 更新數(shù)據(jù) */ public static void update(){ try{ MongoCollection<Document> collection = getCollection('test','student'); //更新文檔 將文檔中sname='Mary'的文檔修改為sage=22 collection.updateMany(Filters.eq('sname', 'Mary'), new Document('$set',new Document('sage',22))); System.out.println('更新成功!'); }catch(Exception e){ System.err.println( e.getClass().getName() ': ' e.getMessage() ); } } /** * 刪除數(shù)據(jù) */ public static void delete(){ try{ MongoCollection<Document> collection = getCollection('test','student'); //刪除符合條件的第一個文檔 collection.deleteOne(Filters.eq('sname', 'Bob')); //刪除所有符合條件的文檔 //collection.deleteMany (Filters.eq('sname', 'Bob')); System.out.println('刪除成功!'); }catch(Exception e){ System.err.println( e.getClass().getName() ': ' e.getMessage() ); } }}
每次執(zhí)行完程序,都可以返回shell模式查看結(jié)果。如:在eclipse執(zhí)行完更新操作后,在shell模式輸入db.student.find()
,可以查看student集合的所有數(shù)據(jù),截圖如下:
聯(lián)系客服