說明:
文檔型數據庫,採用BSON格式。介於關係型數據庫和非關係型數據庫之間,屬於NoSQL數據庫之一。
適合大數據場景使用,大量數據寫入操作。
一個文檔==表中的一行數據,(多個文檔)集合==(多行數據)表,多個集合(表)組成數據庫。
一、Docker中安裝MongoDB服務器:
1.創建mongo容器(端口27017):
docker run -di --name=mall_mongo -p 27017:27017 mongo
2.連接登錄mongo數據庫(安裝在本機地址爲:127.0.0.1):
mongo 192.168.1.119
3.退出(>表示已登錄):
> exit
二、數據類型:
1.基本數據類型:
(1)null類型:
{"key1": null}
(2)布爾類型(true或false):
{"key1": false}
(3)數值類型:
浮點型(默認):
{"key1": 1.0}
4字節整數:
{"key1": NumberInt("1")}
8字節整數:
{"key1": NumberLong("1")}
(4)字符串類型(UTF-8編碼):
{"key1": "value1"}
(5)日期類型:
{"key1", new Date()}
(6)正則表達式類型(js正則語法):
{"key1": /[abcdef]/}
(7)數組類型:
{"key1": ["value1", "value2"]}
(8)內嵌文檔類型(類似json):
{"key1": {"key2": "value1"}}
(9)對象ID類型(自動生成12字節長的字符串):{"_id": ObjectId("xxx...")}
(10)二進制類型(任意字符串的字節方式,用於存儲非UTF-8類型的字符串)。
(11)js代碼類型:{"key1": function(){/.../}}
三、mongo命令:
1.創建/顯示數據庫/表的一些命令:
#創建或使用數據庫,此處數據庫名爲mydb
> use mydb
#顯示數據庫列表
> show dbs
#顯示當前數據庫
> db
#創建表,此處表名爲user
> db.createCollection("user")
#顯示所有表
> show collections
2.插入數據:
語法:db.表名.insert({列名1: 值1, 列名2: 值1})
> db.user.insert({_id: "0", name: "先生1", age: 18})
3.查詢數據(沒有表時自動創建):
語法:db.表名.find({查詢條件})
(1)查全部:
> db.user.find()
(2)按條件查(name=先生1):
> db.user.find({name: "先生1"})
(3)查第1條:
> db.user.findOne()
(4)查前面N條(skip爲跳過幾條,limit爲取幾條):
> db.user.find().skip(0).limit(10)
(5)模糊查詢(語法:/要匹配的字符串/):
#匹配所有name列帶"先"的
> db.user.find({name: /先/})
#匹配name列以"先"開頭的
> db.user.find({name: /^先/})
(6)比較操作符(<、<=、>、>=):
#age>18
> db.user.find({age: {$gt: 18}})
#age>=18
> db.user.find({age: {$gte: 18}})
#age<18
> db.user.find({age: {$lt: 18}})
#age<=18
> db.user.find({age: {$lte: 18}})
#age!=18
> db.user.find({age: {$ne: 18}})
(7)包含/不包含:
#name包含多個值:
> db.user.find({name: {$in: ["先生1", "先生2"]}})
#name不含這些值:
> db.user.find({name: {$nin: ["先生1", "先生2"]}})
(8)條件連接(同時滿足多個條件):
#邏輯與:$and: [{條件1}, {條件2}, ...]
> db.user.find({$and: [{name: "先生1"}, {name: "先生2"}]})
#邏輯或:$or: [{條件1}, {條件2}, ...]
> db.user.find({$or: [{name: "先生1"}, {name: "先生2"}]})
4.修改數據:
(1)語法:db.表名.update({查詢條件}, {$set: {新數據}})
> db.user.update({_id: "0"}, {$set: {name: "先生2"}})
(2)列值增長(將原有列數值增加指定值):
語法:db.表名.update({查詢條件}, {$inc: {列名: 要增加的值}})
> db.user.update({_id: "0"}, {$inc: {age: 1}})
5.刪除數據:
語法:db.表名.remove({條件})
(1)刪全部:
> db.user.remove({})
(2)按條件刪:
> db.user.remove({_id: "0"})
6.統計條數:
語法:db.表名.count({條件})
> db.user.count({name: "先生"})
四、用MongoDB-Api操作MongoDB數據:
1.導入MongoDB驅動包:
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.12.5</version>
</dependency>
</dependencies>
2.增刪改查(Dao類要加上@Component被掃描創建實例):
連接/關閉:
//獲取表操作對象
private MongoCollection<Document> getTableObject() {
//建立數據庫連接
mClient = new MongoClient("192.168.3.119");
//獲取mydb數據庫操作對象
MongoDatabase db = mClient.getDatabase("mydb");
//獲取User表操作對象
MongoCollection<Document> table = db.getCollection("user");
return table;
}
//關閉連接
private void close() {
if (mClient != null) {
//關閉連接
mClient.close();
mClient = null;
}
}
(1)插入數據:
//插入數據
public void insert(User user) {
//1.獲取User表操作對象
MongoCollection<Document> table = getTableObject();
//2.創建數據
Map<String, Object> map = new HashMap<String, Object>();
map.put("_id", user.getId());
map.put("name", user.getName());
map.put("age", user.getAge());
//3.創建一條文檔記錄
Document item = new Document(map);
//4.執行插入操作
table.insertOne(item);
//4.table.insertMany(null); //插入多個
//5.關閉連接
close();
}
(2)刪除數據:
//刪除數據
public void delete(String id) {
//1.獲取User表操作對象
MongoCollection<Document> table = getTableObject();
//2.創建條件
BsonDocument bson = new BsonDocument();
bson.put("_id", new BsonString(id)); //BsonInt32爲int,BsonBoolean爲boolean
//3.執行刪除
table.deleteOne(bson);
//4.關閉連接
close();
}
(3)更新數據:
//更新數據
public void update(User user) {
//1.獲取User表操作對象
MongoCollection<Document> table = getTableObject();
//2.創建新數據
Map<String, Object> newData = new HashMap<>();
newData.put("name", user.getName());
newData.put("age", user.getAge());
//3.執行更新,第1個參數Filters.eq爲條件,第2個參數爲新數據,$set表示設值
table.updateMany(Filters.eq("_id", user.getId()), new Document("$set", newData));
//4.關閉連接
close();
}
(4)查詢數據:
//查詢全部
public List<User> findAll() {
List<User> users = new ArrayList<User>();
//1.獲取User表操作對象
MongoCollection<Document> table = getTableObject();
//2.查詢所有
FindIterable<Document> result = table.find();
if (result == null) {
return users;
}
//3.取出數據
for (Document item : result) {
/*
item.getString("key1"); //取String類型的值
item.getInteger("key1"); //取int類型
item.getDouble("key1"); //取double類型
item.getBoolean("key1"); //取boolean類型
item.getDate("key1"); //取Date類型
item.getLong("key1"); //取long類型
*/
users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));
}
//4.關閉連接
close();
return users;
}
//按條件查詢
public List<User> query(String id, String name, int age) {
List<User> users = new ArrayList<User>();
//1.獲取User表操作對象
MongoCollection<Document> table = getTableObject();
//2.建立條件對象
//條件:_id = 0
BasicDBObject where1 = new BasicDBObject("_id", "0");
//條件:age >= 18
BasicDBObject where2 = new BasicDBObject("age", new BasicDBObject("$gte", 18));
//模糊查詢:name中有"先生"字的
BasicDBObject where3 = new BasicDBObject("name", new BasicDBObject("$regex", "先生"));
//3.執行查詢
FindIterable<Document> result = table.find(where1);
if (result == null) {
return users;
}
//4.取出查詢結果
for (Document item : result) {
users.add(new User(item.getString("_id"), item.getString("name"), item.getInteger("age")));
}
//5.關閉連接
return users;
}
五、SpringData-MongoDB使用:
1.導入SpringData-MongoDB依賴包:
<dependencies>
<!-- 導入SpringData-MongoDB依賴包 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
</dependencies>
2.創建application.yml,配置mongodb服務器地址與數據庫名:
server:
port: 10003 #本微服務端口
spring:
application:
name: mall-mongodb #本微服務名稱
data:
mongodb:
host: 192.168.3.119 #mongodb服務器地址
database: mydb #數據庫名稱
3.創建實體類:
@Document(collection = "user") //映射表的名字
public class User implements Serializable {
@Id //數據庫_id
private String _id;
private String name;
private int age;
public String get_id() {
return _id;
}
public void set_id(String _id) {
this._id = _id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4.創建Dao接口類(SpringData-MongoDB數據操作類):
//SpringData-MongoDB數據操作類
@Component
public interface UserDao extends MongoRepository<User, String> { //dao需要繼承MongoRepository
}
5.調用Dao實現類進行增刪改查操作:
@Transactional //開啓事務
@Service //標識此類爲業務層類(service層)
public class UserBiz {//操作Dao的業務類
@Autowired
private UserDao userDao; //dao操作類
@Autowired
private MongoTemplate mongoTemplate; //MongoDB原生API操作類
//插入數據
public void insert(User user) {
userDao.insert(user);
}
//刪除數據
public void delete(String id) {
userDao.deleteById(id);
}
//更新數據
public void update(User user) {
userDao.save(user);
}
//使用MongoTemplate更新數據
public void updateByTemplate(User user) {
//1.增加查詢條件:_id=xxx
Query q = new Query();
q.addCriteria(Criteria.where("_id").is(user.get_id()));
//2.設置新數據
Update u = new Update();
u.set("name", user.getName());
u.set("age", user.getAge());
//3.執行更新
mongoTemplate.updateFirst(q, u, "user");
}
//查詢全部
public List<User> findAll() {
return userDao.findAll();
}
//按條件查詢單個
public User findById(String id) {
return userDao.findById(id).get();
}
//分頁查詢
public List<User> queryPage(int pageIndex, int pageSize) {//pageIndex頁碼從0開始,pageSize一頁多少條
Pageable pageable = PageRequest.of(pageIndex, pageSize); //創建分頁條件
return userDao.queryPage(pageable).getContent(); //分頁查詢
}
}