MongoDB應用實戰
MongoDB的適用場景
- 網站數據:Mongo非常適合實時的插入、更新和查詢,並具備網站實時數據存儲所需的複製及高度伸縮性
- 緩存:由於性能很高,Mongo也適合作爲信息基礎設施的緩存層。在系統重啓之後,由Mongo搭建的持久化緩存層可以避免下層的數據源過載
- 大尺寸、低價值的數據:使用傳統的關係型數據庫存儲一些大尺寸低價值的數據時會比較浪費。
- 高伸縮性的場景:MongoDB非常適合由數十或數百服務器組成的數據庫,Mongo的路線圖中已經包含對MapReduce引擎的內置支持以及集羣高可用的解決方案
- 用於對象及JSON數據的存儲:Mongo的BSON數據格式也非常適合文檔化格式的存儲及查詢
MongoDB的行業場景
- 遊戲場景:使用MongoDB存儲遊戲用戶信息、用戶的裝備、積分等直接以內嵌文檔的形式存儲,方便查詢、更新。
- 物流場景:使用MongoDB存儲訂單信息,訂單狀態在運送過程中會不斷更新,以MongoDB內嵌數組的形式來存儲,一次查詢就能將訂單所有的變更讀取出來
- 社交場景:使用MongoDB存儲存儲用戶信息,以及用戶發表的朋友圈信息,通過地理位置索引實現附近的人、地點等功能
- 物聯網場景:使用MongoDB存儲所有接入的智能設備信息,以及設備彙報的日誌信息,並對這些信息進行多維度的分析
- 直播場景:使用MongoDB存儲用戶信息、禮物信息等
也可以根據下面這個表判斷能否使用MongoDB:
應用特性 | Yes/No |
---|---|
應用不需要事務及複雜join支持 | |
新應用,需求會變,數據模型無法確定,想快速迭代開發 | |
應用需要TB甚至 PB 級別數據存儲 | |
應用發展迅速,需要能快速水平擴展 | |
應用要求存儲的數據不丟失 | |
應用需要99.999%高可用 | |
應用需要大量的地理位置查詢、文本查詢 |
如果以上條件滿足,那麼就可以使用MongoDB。
MongoDB Java客戶端
下面將介紹三種方式連接MongoDB。分別是:MogoClient、MongoTemplate、MongoRepository。
1. MongoClient
引入依賴
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>3.10.1</version>
</dependency>
文檔添加
public static void add(){
MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("user");
Document document=Document.parse("{name:'lisi',city:'bj',birth_day:new ISODate('2001-08-01'),expectSalary:18000}");
collection.insertOne(document);
mongoClient.close();
}
文檔查詢
public static void query(){
MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("user");
Document sortDocument=new Document();
sortDocument.append("expectSalary",1);
FindIterable<Document> documents = collection.find().sort(sortDocument);
for (Document document:documents){
System.out.println(document);
}
mongoClient.close();
}
public static void query2(){
MongoClient mongoClient=new MongoClient("192.168.56.115",27017);
MongoDatabase database = mongoClient.getDatabase("test");
MongoCollection<Document> collection = database.getCollection("user");
FindIterable<Document> documents = collection.find(Filters.gt("expectSalary", 21000));
for (Document document:documents){
System.out.println(document);
}
mongoClient.close();
}
2. MongoTemplate
2.1 在Spring應用裏配置如下:
引入依賴:
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-mongodb</artifactId>
<version>2.0.9.RELEASE</version>
</dependency>
注入Spring Bean
<!-- 構建MongoDb工廠對象 -->
<mongo:db-factory id="mongoDbFactory"
client-uri="mongodb://192.168.211.133:37017/lg_resume">
</mongo:db-factory>
<!-- 構建 MongoTemplate 類型的對象 -->
<bean id="mongoTemplate"
class="org.springframework.data.mongodb.core.MongoTemplate">
<constructor-arg index="0" ref="mongoDbFactory"></constructor-arg>
</bean>
2.2 Spring Boot裏配置如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
配置文件:
spring.data.mongodb.host=192.168.56.115
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
開始使用mongoTemplate
@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private MongoTemplate mongoTemplate;
@Override
public List<User> getUser(String name) {
Query query=new Query();
query.addCriteria(Criteria.where("name").is(name));
List<User> users = mongoTemplate.find(query, User.class, "user");
return users;
}
@Override
public User addUser(User user) {
User result = mongoTemplate.insert(user);
return result;
}
@Override
public List<User> getUser(String name, Double expectSalary) {
Query query=new Query();
query.addCriteria(Criteria.where("name").is(name).andOperator(Criteria.where("expectSalary").gt(expectSalary)));
return mongoTemplate.find(query,User.class);
}
@Override
public void updateUser(String name, Double expectSalary) {
Query query=new Query();
query.addCriteria(Criteria.where("name").is(name));
Update update=new Update();
update.set("expectSalary",expectSalary);
mongoTemplate.updateFirst(query,update,User.class);
}
@Override
public void deleteUser(String name) {
mongoTemplate.remove(Query.query(Criteria.where("name").is(name)),User.class);
}
}
3. MongoRepository
3.1 引入依賴
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.2.2.RELEASE</version>
</dependency>
3.2 配置文件:
spring.data.mongodb.host=192.168.56.115
spring.data.mongodb.port=27017
spring.data.mongodb.database=test
3.3 編寫實體類,並加上@Document("集合名")
3.4 編寫Repository接口,繼承MongoRepository
public interface UserRepository extends MongoRepository<User, String> {
List<User> findByName(String username);
List<User> findByNameAndExpectSalaryGreaterThan(String username, Double expectSalary);
void deleteByName(String username);
}
3.5 使用Repository
@Repository
public class UserDaoImpl2 implements UserDao{
@Autowired
private UserRepository userRepository;
@Override
public List<User> getUser(String name) {
List<User> users = userRepository.findByName(name);
return users;
}
@Override
public User addUser(User user) {
User result = userRepository.save(user);
return result;
}
@Override
public List<User> getUser(String name, Double expectSalary) {
List<User> users = userRepository.findByNameAndExpectSalaryGreaterThan(name, expectSalary);
return users;
}
@Override
public void updateUser(String name, Double expectSalary) {
User user=new User();
user.setName(name);
user.setExpectSalary(expectSalary);
userRepository.save(user);
}
@Override
public void deleteUser(String name) {
userRepository.deleteByName(name);
}
}