4.0.3的mongodb 安裝和java使用
一 整合
由於本人的碼雲太多太亂了,於是決定一個一個的整合到一個springboot專案裡面。
附上自己的github專案地址 https://github.com/247292980/spring-boot
附上彙總博文地址 https://www.cnblogs.com/ydymz/p/9391653.html
以整合功能
spring-boot,FusionChart,thymeleaf,vue,ShardingJdbc,mybatis-generator,微信分享授權,drools,spring-security,spring-jpa,webjars,Aspect,drools-drt,rabbitmq,zookeeper
這次就來整合下簡單的mongodb 安裝和java使用
二 安裝
基於菜鳥 http://www.runoob.com/mongodb/mongodb-tutorial.html
1.官網安裝,沒什麼好說的新手msi直接一路點下去,老手解壓安裝,那就更不用說了...
2.環境變數設定,這部很多教程不寫,其實多個這玩意cmd用起來很舒服的
3.建立資料目錄,data資料夾,conf資料夾,db資料夾,log資料夾
4.建立配置檔案mongod.cfg和日誌檔案。配置檔案自己修改成相應的地址
systemLog: destination: file path: D:\mongodb-4.0.3\data\log\mongod.log storage: dbPath: D:\mongodb-4.0.3\data\db
5.安裝成服務
mongod --config "D:\mongodb-4.0.3\conf\mongod.cfg" --install
6.啟動服務
net start MongoDB
ps.
net stop MongoDB 停止服務
mongod --remove 解除安裝服務
三 使用
1.啟動後臺shell,
mongo
第一次是這樣的,他提示你要加個密碼
2.選擇admin資料庫
use admin
3.建立使用者
db.createUser( { user: "admin", //使用者名稱 pwd: "123456", //密碼 roles: [ { role: "root", db: "admin" } ] //許可權 } )
ps.
user文件欄位介紹: user欄位,為新使用者的名字; pwd欄位,使用者的密碼; cusomData欄位,為任意內容,例如可以為使用者全名介紹; roles欄位,指定使用者的角色,可以用一個空陣列給新使用者設定空角色; Built-In Roles(內建角色): 1. 資料庫使用者角色:read、readWrite; 2. 資料庫管理角色:dbAdmin、dbOwner、userAdmin; 3. 叢集管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager; 4. 備份恢復角色:backup、restore; 5. 所有資料庫角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase 6. 超級使用者角色:root // 這裡還有幾個角色間接或直接提供了系統超級使用者的訪問(dbOwner 、userAdmin、userAdminAnyDatabase) 7. 內部角色:__system
3.解除安裝服務,重灌再啟動,注意--auth
mongod --auth --config "D:\mongodb-4.0.3\conf\mongod.cfg" --install
net start MongoDB
net stop MongoDB 停止服務
mongod --remove 解除安裝服務
此時啟動mongo不使用密碼登入則看起來成功進入
實際
4.正確的啟動
mongo --port 27017 -u "admin" -p "123456" --authenticationDatabase "admin"
四 語法
有興趣的建議直接菜鳥找吧,瞭解一下即可
五 java使用
官方api我喜歡這樣的官方! http://mongodb.github.io/mongo-java-driver/3.7/javadoc/
坑點一
百度上大多數教程只給了程式碼,但是依然不成功,因為少導了包,導致java.lang.NoClassDefFoundError: com/mongodb/DBObject
pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver</artifactId> <version>3.8.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mongodb/mongodb-driver-core --> <dependency> <groupId>org.mongodb</groupId> <artifactId>mongodb-driver-core</artifactId> <version>3.8.2</version> </dependency> <!-- https://mvnrepository.com/artifact/org.mongodb/bson --> <dependency> <groupId>org.mongodb</groupId> <artifactId>bson</artifactId> <version>3.8.2</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-thymeleaf</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
坑點二
哪怕你繞開的包的坑,你還會進入一個許可權驗證的坑,主要是因為百度上的版本太低了,需要修改一下校驗的版本...而我是直接從官網高最新版本的,這個bug就修復了。但是,配置方面有些許不相容。例如,mongodb和spring-mongodb預設的認證機制不同。
1、mongodb的認證機制有2種:SCRAM-SHA-1和MONGODB-CR。3.0之後版本預設為:SCRAM-SHA-1; 2、spring-mongodb預設為:MONGODB-CR,並不支援設定認證方式;但是,最新的包已修復這個問題
網上的教程,大多太舊了,所以出現jar包太老而是mongodb太老的問題,或者相反的問題,orz....其實一句話說就是注意版本或者最簡單的就是直接用最新
所以,若是你中途覺得菜鳥寫的很好,難免會進坑然後又來看我的文章,這時候,我建議你從來來一次...因為,我把前面的不相容的錯修改,但並沒有重點指出,因為這只是版本問題。你直接再搞個低版本基本就不會有事了。
程式碼
public class MongoDBConnect { public static String HOST = "127.0.0.1"; public static String PORT = "27017"; public static void main(String[] args) { try { System.out.println("MongoDBConnect to database begin"); //連線到MongoDB服務 如果是遠端連線可以替換“localhost”為伺服器所在IP地址 //ServerAddress()兩個引數分別為 伺服器地址 和 埠 ServerAddress serverAddress = new ServerAddress("localhost", 27017); List<ServerAddress> addrs = new ArrayList<ServerAddress>(); addrs.add(serverAddress); //MongoCredential.createScramSha1Credential()三個引數分別為 使用者名稱 資料庫名稱 密碼 MongoCredential credential = MongoCredential.createScramSha1Credential("admin", "admin", "123456".toCharArray()); List<MongoCredential> credentials = new ArrayList<MongoCredential>(); credentials.add(credential); //通過連線認證獲取MongoDB連線 MongoClient mongoClient = new MongoClient(addrs, credentials); //連線到資料庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("admin"); System.out.println("MongoDBConnect to database successfully"); //建立集合 // mongoDatabase.createCollection("test"); // System.out.println("集合建立成功"); //選擇集合 MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); /**插入文件 * 1. 建立文件 org.bson.Document 引數為key-value的格式 * 2. 建立文件集合List<Document> * 3. 將文件集合插入資料庫集合中 mongoCollection.insertMany(List<Document>) 插入單個文件可以用 mongoCollection.insertOne(Document) * */ Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List<Document> documents = new ArrayList<Document>(); documents.add(document); collection.insertMany(documents); System.out.println("文件插入成功"); /**檢索所有文件 * 1. 獲取迭代器FindIterable<Document> * 2. 獲取遊標MongoCursor<Document> * 3. 通過遊標遍歷檢索出的文件集合 * */ FindIterable<Document> findIterable = collection.find(); MongoCursor<Document> mongoCursor = findIterable.iterator(); while (mongoCursor.hasNext()) { System.out.println(mongoCursor.next()); } System.out.println("檢索所有文件成功"); //更新文件 將文件中likes=100的文件修改為likes=200 collection.updateMany(Filters.eq("likes", 100), new Document("$set", new Document("likes", 200))); //檢索檢視結果 findIterable = collection.find(); mongoCursor = findIterable.iterator(); while (mongoCursor.hasNext()) { System.out.println(mongoCursor.next()); } System.out.println("更新文件成功"); //刪除符合條件的第一個文件 collection.deleteOne(Filters.eq("likes", 200)); //刪除所有符合條件的文件 collection.deleteMany(Filters.eq("likes", 200)); //檢索檢視結果 findIterable = collection.find(); mongoCursor = findIterable.iterator(); while (mongoCursor.hasNext()) { System.out.println(mongoCursor.next()); } System.out.println("刪除文件成功"); } catch (Exception e) { System.err.println(e.getClass().getName() + ": " + e.getMessage()); } } }
六 總結
關於mongodb,redis,mysql 簡要對比,其實這篇文章寫得很好,我給個結論就行了
https://www.cnblogs.com/lovychen/p/5613986.html
mongodb:
它是一個記憶體資料庫,操作的資料都是放在記憶體裡面的。
但實際資料存在硬碟中,mmap的方式可以說是索引在記憶體中。
持久化方式:
mongodb的所有資料實際上是存放在硬碟的,所有要操作的資料通過mmap的方式對映到記憶體某個區域內。mongodb就在這塊區域裡面進行資料修改,避免了零碎的硬碟操作。
至於mmap上的內容flush到硬碟就是作業系統的事情了,所以如果mongodb在記憶體中修改了資料後,mmap資料flush到硬碟之前,系統宕機了,資料就會丟失。
redis:
它就是一個不折不扣的記憶體資料庫了。
持久化方式:redis所有資料都是放在記憶體中的,持久化是使用RDB方式或者aof方式。
mysql:
無論資料還是索引都存放在硬碟中。到要使用的時候才交換到記憶體中。能夠處理遠超過記憶體總量的資料。
資料量和效能: 當實體記憶體夠用的時候,redis>mongodb>mysql 當實體記憶體不夠用的時候,redis和mongodb都會使用虛擬記憶體。mysql>mongodb>redis redis要開始虛擬記憶體,那很明顯要麼加記憶體條,要麼你換個資料庫了。 mongodb不一樣,只要,業務上能保證,冷熱資料的讀寫比,使得熱資料在實體記憶體中,mmap的交換較少。mongodb還是能夠保證效能。有人使用mongodb儲存了上T的資料。 mysql根本就不需要擔心資料量跟記憶體下的關係。不過,記憶體的量跟熱資料的關係會極大地影響效能表現。
總結就是
虛擬記憶體不夠是 選擇mongodb和mysql
虛擬記憶體夠是 選擇mongodb和redis
但實際上,更多公司選擇redis和mysql,這就是技術棧的問題,畢竟nosql的定義和開發設計沒幾個程式設計師瞭解