1. 程式人生 > 實用技巧 >monggodb學習系列:1,mongodb入門

monggodb學習系列:1,mongodb入門

>>> hot3.png

背景:先問自己三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怎麼使用?怎麼去管理? 怎麼去搭建叢集,解決現在海量系統的三高一大問題?

三高: 高併發,高擴充套件,高可用 ;

一大:大資料,海量資料;

本次分享內容目錄:

  1. mongodb的安裝;
  2. mongodb的基本命令熟悉;
  3. 使用java驅動使用mongodb;
  4. 查詢優化器的工具熟悉;
  5. 入門小結

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目錄中)

43

mongodb的基本命令熟悉;

1, show dbs; //檢視mongodb中所有的資料庫;

47

2, db.version();// 檢視db的版本

50

3,db.stats();//檢視當前db的狀態;

53

4,db.serverStatus();//檢視伺服器的狀態

55

5,db.repairDatabase();//修復資料庫,壓縮預分配空間,整理碎片等;

58

6,db.hostInfo();//本伺服器的資訊;

61

7,db.isMaster();//是否是主伺服器

63

8,db.currentOp();//檢視目前在執行的操作

65

8.1 use dbName;// 切換db

69

8.2 db.dropDatabase(); //刪除db

72

對資料表的操作

9,db.getCollectionNames();//檢視資料庫所有的表:

75

10,插入

db.users.save({"username":"abcdefgk","password":"abcabc","lang":"En","age":18});//插入資料

81

11,查詢

78

12,刪除

db.users.remove({"_id":ObjectId("58184bbff7507c0558153923")});

85

13,修改

db.users.update({"_id" : ObjectId("58184bbff7507c0558153922")},{$set:{"lang":"

update"}},false,true);

88

14, 查詢並修改

> db.users.findAndModify({query:{lang:{$eq:"en"}},update:{$set:{"lang":"fuck"}}}

);

93

15,檢視索引,索引大小;

db.users.getIndexes();

96

db.users.totalIndexSize();//索引的總大小

99

db.users.reIndex();//讀取當前表的所有索引

101

16,建立索引

103

17,刪除索引

105

18,語句塊操作

迴圈插入資料;

108

db.users.find({age: {$lte: 28}}, {age: false}).forEach(printjson);

19,查詢之前的錯誤

110

20,查詢語法

find(condition1,row, ).sort(conditon2).skip(num1).limit(num2).pretty()

condition: 條件,裡面可以放條件,正則表示式,

skip(num1) 略過多少條資料

limit(num2) 取前多少條資料

pretty() json格式展示

按照範圍來搜尋:

119

按照正則來搜尋:

121

選擇顯示的行

123

排序 1為升,-1為降

125

使用java驅動使用mongodb;

本質: 把相關的mongodb的命令列命令進行封裝,提供java介面;

128

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

133

優化步驟:

135

可以觀察某查詢,是否走了索引;

138

入門小結

通過本次小結,知道了什麼是mongodb, mongodb在什麼場景下使用,以及怎麼使用mongodb,分命令列和java程式去使用;

http://note.youdao.com/share/?id=fa62cd2386f253af68a7e29c6638f158&type=note#/

轉載於:https://my.oschina.net/mifans/blog/818304