Ubuntu下MongoDB的安裝和使用

MongoDB安裝很簡單,無需下載源文件,可以直接用apt-get命令進行安裝。?

打開終端,輸入以下命令:

sudoapt-get install mongodb

截圖如下:?

安裝完成后,在終端輸入以下命令查看MongoDB版本:

mongo -version

輸出版本信息,表明安裝成功,截圖如下:?

啟動和關(guān)閉mongodb命令如下:

service mongodb start

service mongodb stop

截圖如下:?

默認(rèn)設(shè)置MongoDB是隨Ubuntu啟動自動啟動的。?

輸入以下命令查看是否啟動成功:

pgrep mongo-l#注意:-l是英文字母l,不是阿拉伯?dāng)?shù)字1

截圖如下:?

卸載MongoDB

sudoapt-get --purge remove mongodb mongodb-clients mongodb-server


二. 重啟系統(tǒng)以后mongo程序要自己重新手動啟動,步驟如下:

1.運行“locate mongo”命令查看系統(tǒng)默認(rèn)把mongo裝到了哪里,這里主要關(guān)注三個東西.

(1)一個是名為“mongod”的程序的位置(他相當(dāng)于mongo數(shù)據(jù)庫的Server,需要一直在后臺運行,我的路徑:/usr/bin/mongod);

(2)一個是mongo 數(shù)據(jù)庫log日志文件的位置(log日志文件要查看到具體的文件名,具體用法在后面有介紹,我的路徑:/var/log/mongodb/mongodb.log);

(3)一個是mongo的log日志的位置(我的路徑:/var/log/mongodb/mongodb.log)。

2.先進入mongod所在的目錄(/usr/bin/mongod),然后運行“./mongod --dbpath /var/lib/mongodb/ --logpath /var/log/mongodb/mongodb.log --logappend &

--dbpath:指定mongo的數(shù)據(jù)庫文件在哪個文件夾

--logpath:指定mongo的log日志是哪個,這里log一定要指定到具體的文件名

--logappend:表示log的寫入是采用附加的方式,默認(rèn)的是覆蓋之前的文件

&:表示程序在后臺運行

注意:如果是系統(tǒng)非正常關(guān)閉,這樣啟動會報錯,由于mongodb自動被鎖上了,這是需要進入mongodb數(shù)據(jù)庫文件所在的目錄(/var/lib/mongodb/),刪除目錄中的mongodb.lock文件,然后再進行上述操作。

三、使用MongoDB

shell命令模式

輸入mongo進入shell命令模式,默認(rèn)連接的數(shù)據(jù)庫是test數(shù)據(jù)庫,在此之前一定要確保你已經(jīng)啟動了MongoDB,否則會出現(xiàn)錯誤,啟動之后運行成功,如下截圖:?

常用操作命令:

數(shù)據(jù)庫相關(guān)?

show dbs:顯示數(shù)據(jù)庫列表?

show collections:顯示當(dāng)前數(shù)據(jù)庫中的集合(類似關(guān)系數(shù)據(jù)庫中的表table)?

show users:顯示所有用戶?

use yourDB:切換當(dāng)前數(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ù)庫。截圖如下:?


下面以一個School數(shù)據(jù)庫為例,在School數(shù)據(jù)庫中創(chuàng)建兩個集合teacher和student,并對student集合中的數(shù)據(jù)進行增刪改查基本操作(集合Collection相當(dāng)于關(guān)系型數(shù)據(jù)庫中的表table)。?

1、切換到School數(shù)據(jù)庫

use School#切換到School數(shù)據(jù)庫。MongoDB 無需預(yù)創(chuàng)建School數(shù)據(jù)庫,在使用時會自動創(chuàng)建

2、創(chuàng)建Collection

db.createCollection('teacher')#創(chuàng)建一個聚集集合。MongoDB 其實在插入數(shù)據(jù)的時候,也會自動創(chuàng)建對應(yīng)的集合,無需預(yù)定義集合

截圖如下:?

3、插入數(shù)據(jù)?

與數(shù)據(jù)庫創(chuàng)建類似,插入數(shù)據(jù)時也會自動創(chuàng)建集合。?

插入數(shù)據(jù)有兩種方式:insert和save。

db.student.insert({_id:1, sname:'zhangsan', sage:20})#_id可選db.student.save({_id:1, sname:'zhangsan', sage:22})#_id可選

這兩種方式,其插入的數(shù)據(jù)中_id字段均可不寫,會自動生成一個唯一的_id來標(biāo)識本條數(shù)據(jù)。而insert和save不同之處在于:在手動插入_id字段時,如果_id已經(jīng)存在,insert不做操作,save做更新操作;如果不加_id字段,兩者作用相同都是插入數(shù)據(jù)。截圖如下:?

添加的數(shù)據(jù)其結(jié)構(gòu)是松散的,只要是bson格式均可,列屬性均不固定,根據(jù)添加的數(shù)據(jù)為準(zhǔn)。先定義數(shù)據(jù)再插入,就可以一次性插入多條數(shù)據(jù),截圖如下:?

運行完以上例子,student 已自動創(chuàng)建,這也說明 MongoDB 不需要預(yù)先定義 collection ,在第一次插入數(shù)據(jù)后,collection 會自動的創(chuàng)建。截圖如下:?

3、查找數(shù)據(jù)?

db.youCollection.find(criteria, filterDisplay)?

criteria :查詢條件,可選?

filterDisplay:篩選顯示部分?jǐn)?shù)據(jù),如顯示指定列數(shù)據(jù),可選(當(dāng)選擇時,第一個參數(shù)不可省略,若查詢條件為空,可用{}做占位符,如下例第三句)

db.student.find()#查詢所有記錄。相當(dāng)于:select * from studentdb.student.find({sname:'lisi'})#查詢sname='lisi'的記錄。相當(dāng)于: select * from student where sname='lisi'db.student.find({},{sname:1, sage:1})#查詢指定列sname、sage數(shù)據(jù)。相當(dāng)于:select sname,sage from student。sname:1表示返回sname列,默認(rèn)_id字段也是返回的,可以添加_id:0(意為不返回_id)寫成{sname: 1, sage: 1,_id:0},就不會返回默認(rèn)的_id字段了db.student.find({sname:'zhangsan', sage:22})#and 與條件查詢。相當(dāng)于:select * from student where sname = 'zhangsan' and sage = 22db.student.find({$or: [{sage:22}, {sage:25}]})#or 條件查詢。相當(dāng)于: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為插入,默認(rèn)是false,不插入。?

multi: mongodb默認(rèn)是false,只更新找到的第一條記錄,如果這個參數(shù)為true,就把按條件查出來多條記錄全部更新。默認(rèn)false,只修改匹配到的第一條數(shù)據(jù)。?

其中criteria和objNew是必選參數(shù),upsert和multi可選參數(shù)?

舉例如下:

db.student.update({sname:'lisi'}, {$set: {sage:30}},false,true)#相當(dāng)于:update student set sage =30 where sname = 'lisi';

操作截圖如下:?

5、刪除數(shù)據(jù)

db.student.remove({sname:'chenliu'})#相當(dāng)于:delete from student where sname='chenliu'

1

操作截圖如下:?


6、退出shell命令模式?

輸入exit或者Ctrl+C退出shell命令模式

注意:MongoDB相較安全性更偏向易用性,默認(rèn)是沒有開啟用戶權(quán)限的,如果想開啟用戶權(quán)限,可以參考Ubuntu下開啟MongoDB用戶權(quán)限

Java API編程實例

第一步:下載Java MongoDB Driver驅(qū)動jar包,Java MongoDB Driver下載地址,默認(rèn)的下載目錄為~/下載或者~/Downloads?

第二步:打開Eclipse,新建Java Project,新建Class,引入剛剛下載的jar包?

第三步:編碼實現(xiàn)?

下面是源代碼:

importjava.util.ArrayList;importjava.util.List;importorg.bson.Document;importcom.mongodb.MongoClient;importcom.mongodb.client.MongoCollection;importcom.mongodb.client.MongoCursor;importcom.mongodb.client.MongoDatabase;importcom.mongodb.client.model.Filters;publicclassTestMongoDB{/**? ? * @paramargs? ? */publicstaticvoidmain(String[] args) {? ? ? ? insert();//插入數(shù)據(jù)。執(zhí)行插入時,可將其他三句函數(shù)調(diào)用語句注釋掉,下同//? ? ? find(); //查找數(shù)據(jù)//? ? ? update();//更新數(shù)據(jù)//? ? ? delete();//刪除數(shù)據(jù)}/**? ? * 返回指定數(shù)據(jù)庫中的指定集合? ? * @paramdbname 數(shù)據(jù)庫名? ? * @paramcollectionname 集合名? ? * @return*///MongoDB無需預(yù)定義數(shù)據(jù)庫和集合,在使用的時候會自動創(chuàng)建publicstaticMongoCollectiongetCollection(String dbname,String collectionname){//實例化一個mongo客戶端,服務(wù)器地址:localhost(本地),端口號:27017MongoClient? mongoClient=newMongoClient("localhost",27017);//實例化一個mongo數(shù)據(jù)庫MongoDatabase mongoDatabase = mongoClient.getDatabase(dbname);//獲取數(shù)據(jù)庫中某個集合MongoCollection collection = mongoDatabase.getCollection(collectionname);returncollection;? ? }/**

? ? * 插入數(shù)據(jù)

? ? */publicstaticvoidinsert(){try{//連接MongoDB,指定連接數(shù)據(jù)庫名,指定連接表名。MongoCollection collection= getCollection("test","student");//實例化一個文檔,文檔內(nèi)容為{sname:'Mary',sage:25},如果還有其他字段,可以繼續(xù)追加appendDocument doc1=newDocument("sname","Mary").append("sage",25);//實例化一個文檔,文檔內(nèi)容為{sname:'Bob',sage:20}Document doc2=newDocument("sname","Bob").append("sage",20);? ? ? ? ? ? List documents =newArrayList();//將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ù)

? ? */publicstaticvoidfind(){try{? ? ? ? ? ? MongoCollection collection = getCollection("test","student");//通過游標(biāo)遍歷檢索出的文檔集合 //? ? ? ? ? MongoCursor? 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默認(rèn)會顯示)//查詢所有數(shù)據(jù)MongoCursor? 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ù)

? ? */publicstaticvoidupdate(){try{? ? ? ? ? ? MongoCollection collection = getCollection("test","student");//更新文檔? 將文檔中sname='Mary'的文檔修改為sage=22? collection.updateMany(Filters.eq("sname","Mary"),newDocument("$set",newDocument("sage",22)));? ? ? ? ? ? ? System.out.println("更新成功!");? ? ? ? }catch(Exception e){? ? ? ? ? ? System.err.println( e.getClass().getName() +": "+ e.getMessage() );? ? ? ? }? ? }/**

? ? * 刪除數(shù)據(jù)

? ? */publicstaticvoiddelete(){try{? ? ? ? ? ? MongoCollection 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ù),截圖如下:?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,002評論 6 542
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,400評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,136評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,714評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,452評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,818評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,812評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,997評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,552評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,292評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,510評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,035評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,721評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,121評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,429評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,235評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,480評論 2 379