monggodb學習系列:1,mongodb入門
背景:先問自己三W,WHAT, WHEN,HOW?
WHAT: mongodb是什麼?
概念 | mongodb是一個高可用,分散式,模式靈活的文件資料庫。底層使用C++編寫,是一種介於關係資料庫和NoSql資料庫之間的資料庫。在海量讀寫的情況下有極高的查詢效能 |
高可用 | 多地複製,自動故障轉移,查詢監視 |
分散式 | 自動分片,支援雲級別的伸縮 |
模式靈活 | 擴充套件方便,支援動態查詢,面向集合操作,支援索引 |
文件 | Bson結構, 高效傳輸 |
Nosql : not only sql,非關係資料庫,在web2.0時代,為了解決一大三高的問題引入而留下的資料庫概念,代表作有 mongodb, redis,
nosql 具有硬體便宜,效能高,無過多操作,開源的特點;
跟關係資料庫相關概念的對比:
對比專案 | 關係模型 | 文件模型 |
資料物件 | 重複的部分使用單獨的表來儲存 | 使用富文件包含所有資訊 |
資料庫 | db | db |
表 | table | collection |
行 | row | document |
外來鍵 | forignkey | reference |
連線 | join | lookup |
事務 | 支援多表事務控制 | 對文件的操作可以保證原子性 |
WHEN: 什麼時候適合用mongodb,什麼時候不適合使用mongodb?
適合場景 | 說明 |
網站資料 | 在海量的更新查詢場景下具備極高的查詢效能; |
快取 | |
大尺寸低價值資料 | |
高伸縮性場景 | 內建支援了MapReduce |
儲存的是物件或者Json | 原生儲存格式為Bson |
使用的案例: 國內的有淘寶,視覺中國,大眾點評, 國外的有sourcefore, github;
慎用: 在事務要求下較高的場景下慎用;
HOW: mongodb怎麼使用?怎麼去管理? 怎麼去搭建叢集,解決現在海量系統的三高一大問題?
三高: 高併發,高擴充套件,高可用 ;
一大:大資料,海量資料;
本次分享內容目錄:
- mongodb的安裝;
- mongodb的基本命令熟悉;
- 使用java驅動使用mongodb;
- 查詢優化器的工具熟悉;
- 入門小結
mongodb的安裝
順序 | 步驟說明 | |
1 | 下載,解壓到本地磁碟; | https://www.mongodb.com/download-center?jmp=nav |
2 | 新建資料庫和日誌目錄; | d:\mongodb\db d:\mongodb\db\log |
3 | 啟動mongodb | 進入mongodb的安裝目錄下的bin路徑下 mongod --dbpath=d:\mongodb\db --logpath=d:\mongodb\db\log --install |
4 | 設定為系統服務,並啟動 | 啟動服務 net start mongodb |
5 | 客戶端連線 | 在bin路徑下 輸入 mongo, 即連線預設資料庫test |
上個截圖:(如果經常使用mongodb的命令列視窗,自己把bin路徑增加到path目錄中)
mongodb的基本命令熟悉;
1, show dbs; //檢視mongodb中所有的資料庫;
2, db.version();// 檢視db的版本
3,db.stats();//檢視當前db的狀態;
4,db.serverStatus();//檢視伺服器的狀態
5,db.repairDatabase();//修復資料庫,壓縮預分配空間,整理碎片等;
6,db.hostInfo();//本伺服器的資訊;
7,db.isMaster();//是否是主伺服器
8,db.currentOp();//檢視目前在執行的操作
8.1 use dbName;// 切換db
8.2 db.dropDatabase(); //刪除db
對資料表的操作
9,db.getCollectionNames();//檢視資料庫所有的表:
10,插入
db.users.save({"username":"abcdefgk","password":"abcabc","lang":"En","age":18});//插入資料
11,查詢
12,刪除
db.users.remove({"_id":ObjectId("58184bbff7507c0558153923")});
13,修改
db.users.update({"_id" : ObjectId("58184bbff7507c0558153922")},{$set:{"lang":"
update"}},false,true);
14, 查詢並修改
> db.users.findAndModify({query:{lang:{$eq:"en"}},update:{$set:{"lang":"fuck"}}}
);
15,檢視索引,索引大小;
db.users.getIndexes();
db.users.totalIndexSize();//索引的總大小
db.users.reIndex();//讀取當前表的所有索引
16,建立索引
17,刪除索引
18,語句塊操作
迴圈插入資料;
db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson);
19,查詢之前的錯誤
20,查詢語法
find(condition1,row, ).sort(conditon2).skip(num1).limit(num2).pretty()
condition: 條件,裡面可以放條件,正則表示式,
skip(num1) 略過多少條資料
limit(num2) 取前多少條資料
pretty() json格式展示
按照範圍來搜尋:
按照正則來搜尋:
選擇顯示的行
排序 1為升,-1為降
使用java驅動使用mongodb;
本質: 把相關的mongodb的命令列命令進行封裝,提供java介面;
package db.mongo.dao;import com.google.common.collect.Lists; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import db.mongo.core.MongoDatabaseHelp; import db.mongo.model.User; import org.bson.Document; import org.bson.types.ObjectId;import java.util.List;/** * Created by carter on 2016/11/1. */ public class UserDao { MongoCollection documentMongoCollection; public UserDao() { documentMongoCollection = MongoDatabaseHelp.getInstance().getCollection("users"); } public void create(User user) { documentMongoCollection.insertOne(new Document("username",user.getUsername()).append("password",user.getPassword()).append("lang",user.getLang()).append("age",user.getAge())); } public boolean delete(String _id) { return documentMongoCollection.findOneAndDelete(new Document("_id",new ObjectId(_id))).size()>0; } public boolean update(User user) { // if(user.getAge()>0) // { // return documentMongoCollection.updateOne(new Document("_id",new ObjectId(user.get_id())), // new Document("username",user.getUsername()).append("password",user.getPassword()).append("lang",user.getLang()).append("age",user.getAge())).getModifiedCount()>0; // }else // { return documentMongoCollection.updateOne(new Document("_id",new ObjectId(user.get_id())), new Document("$set",new Document("username",user.getUsername()).append("password",user.getPassword()).append("lang",user.getLang()).append("age",user.getAge()))).getModifiedCount()>0;// } } public User find(String _id) { FindIterable result = documentMongoCollection.find(new Document("_id",new ObjectId(_id))); Document document = result.iterator().tryNext(); if(null != document ) { User user = new User(); user.set_id(document.getObjectId("_id").toString()); user.setLang(document.getString("lang")); user.setUsername(document.getString("username")); user.setPassword(document.getString("password")); user.setAge(document.containsKey("age")?Integer.parseInt(String.valueOf(document.get("age"))):0); return user; } return new User(); } public List query() { MongoCursor mongoCursor= documentMongoCollection.find().iterator(); List userList = Lists.newLinkedList(); while (mongoCursor.hasNext()) { Document document = mongoCursor.next(); User user = new User(); user.set_id(document.getObjectId("_id").toString()); user.setLang(document.getString("lang")); user.setUsername(document.getString("username")); user.setPassword(document.getString("password")); user.setAge(document.containsKey("age")?Integer.parseInt(String.valueOf(document.get("age"))):0); userList.add(user); } mongoCursor.close(); return userList; } public List query(int pageIndex) { MongoCursor mongoCursor= documentMongoCollection.find().skip((pageIndex-1)*30).limit(30).iterator(); List userList = Lists.newLinkedList(); while (mongoCursor.hasNext()) { Document document = mongoCursor.next(); User user = new User(); user.set_id(document.getObjectId("_id").toString()); user.setLang(document.getString("lang")); user.setUsername(document.getString("username")); user.setPassword(document.getString("password")); user.setAge(document.containsKey("age")?Integer.parseInt(String.valueOf(document.get("age"))):0); userList.add(user); } mongoCursor.close(); return userList; } public long count() { return documentMongoCollection.count(); } } |
package db.mongo.core;import com.mongodb.MongoClient; import com.mongodb.MongoClientOptions; import com.mongodb.client.MongoDatabase;/** * Created by carter on 2016/11/1. */ public class MongoDatabaseHelp { private static MongoDatabaseHelp ourInstance = new MongoDatabaseHelp(); public static MongoDatabase getInstance() { if(null == mongoDatabase) { MongoClient mongoClient = new MongoClient("172.16.42.22",MongoClientOptions.builder().connectionsPerHost(100)//每個主機的連線數 .threadsAllowedToBlockForConnectionMultiplier(100)//執行緒佇列數,它以上面connectionsPerHost值相乘的結果就是執行緒佇列最大值。如果連線執行緒排滿了佇列就會丟擲“Out of semaphores to get db”錯誤。 .maxWaitTime(10)//最大等待連線的執行緒阻塞時間 .connectTimeout(15*1000)//連線超時的毫秒。0是預設和無限 .socketTimeout(15*1000)//socket超時。0是預設和無限 .build()); mongoDatabase = mongoClient.getDatabase("blog"); } return ourInstance.mongoDatabase; } private static MongoDatabase mongoDatabase; private MongoDatabaseHelp() { } } |
查詢優化器的工具熟悉;
使用mongodb官網提供的查詢分析工具 MongoDB Compass
優化步驟:
可以觀察某查詢,是否走了索引;
入門小結
通過本次小結,知道了什麼是mongodb, mongodb在什麼場景下使用,以及怎麼使用mongodb,分命令列和java程式去使用;
http://note.youdao.com/share/?id=fa62cd2386f253af68a7e29c6638f158&type=note#/
轉載於:https://my.oschina.net/mifans/blog/818304