以下環境為mac osx + jdk 1.8 + mongodb v3.2.3
一、安裝
brew安裝方式是mac下最簡單的方式
brew update brew install mongodb
其它OS上的安裝請參考:https://docs.mongodb.org/manual/installation/
二、啟動
2.1 最基本的啟動
mongod
不加任何參數時,db默認保存在/data/db目錄(如果該目錄不存在,啟動會報錯),監聽的端口是27017,且不啟動安全認證機制(即:誰都可以連接,只要連接上來的用戶都是管理員)
2.2 指定dbpath
mongod --dbpath ~/data/db/mongo
指定dbpath后,數據文件將保存在指定的目錄下(注意:該目錄必須有讀寫權限)
2.3 指定端口
mongod --dbpath ~/data/db/mongo --port 12345
2.4 啟用安全認證
mongod --dbpath ~/data/db/mongo --port 12345 --auth
這個下面還會仔細講解,這里只要記得有--auth這個選項即可。
2.5 其它一些選項
mongod --help
如果想詳細了解所有啟動選項,可以加--help查看所有可選參數。
啟動成功后,可以用 mongo 命令來連接
➜ ~ mongo MongoDB shell version: 3.2.4 connecting to: test >
然后就可以直接使用各種命令來操作db了
三、安全相關
不帶--auth的啟動方式是很可怕的,沒有任何安全控制,一般只限於開發環境。生產環境肯定要開啟安全認證,mongodb在安全認證的主要思路是:
先在某個庫上創建用戶(db.createUser) -> 將該用戶授權(db.auth) -> mongod啟動時指定--auth選項 -> mongo客戶端連接時指定用戶名、密碼、認證db(或者連接時先不指定用戶名、密碼,連接上以后,再用db.auth切換到認證用戶身份)
3.0 創建數據庫
use mydb
跟mysql差不多,use 后加數據庫名稱即可,如果數據庫不存在,會自動創建。假設以下的所有安全相關的操作,都是在mydb這個庫下。
3.1 創建用戶
切換到相對的db后,使用下面的命令創建用戶
db.createUser( { "user" : "admin",
"pwd": "123456",
"roles" : [ "readWrite","dbAdmin","userAdmin"]})
這樣就創建了一個名為admin的管理員,而且具備讀寫、db管理、用戶管理權限。如果想知道mongo默認有哪些roles角色,可參考:https://docs.mongodb.org/manual/reference/built-in-roles/#built-in-roles
3.2 授權
db.auth({
user: "admin",
pwd: "123456"
})
3.3 用--auth 重啟mongod
mongod --auth
3.4 客戶端連接時,指定安全信息
mongo localhost:27017/mydb -u admin -p 123456 --authenticationDatabase mydb
大家參考上面的命令修改相關參數(比如:端口號之類的),連接上去后,可以嘗試
db.orders.insert({'orderId':1,'productName':'iphone'})
看看能否寫入數據。
注:作為對比,大家還可以創建一個其它只有read權限的用戶(比如:guest/guest),同樣的姿勢連接上去,再insert試試,正常情況話,應該寫入失敗。
安全相關的更詳細信息,請參考 :https://docs.mongodb.org/manual/core/authentication/
四、CRUD操作
一般教程上都是講解如果在mongo終端下使用命令來做CRUD,但是更多情況下,我們是在代碼里完成這些操作的,所以下面說下如何利用spring-data-mongo來操作mongo,以gradle項目為例,下面的代碼參考了spring官方的示例代碼
4.1 build.gradle文件
group 'com.cnblogs.yjmyzz'
version '1.0-SNAPSHOT'
apply plugin: 'java'
apply plugin: 'application'
apply plugin: 'spring-boot'
sourceCompatibility = 1.8
buildscript {
repositories {
maven {
url 'http://maven.oschina.net/content/groups/public/'
}
}
dependencies {
classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.3.RELEASE")
}
}
repositories {
maven {
url 'http://maven.oschina.net/content/groups/public/'
}
}
dependencies {
compile 'org.springframework.data:spring-data-mongodb:1.8.4.RELEASE'
compile("org.springframework.boot:spring-boot-starter-actuator")
testCompile group: 'junit', name: 'junit', version: '4.12'
}
mainClassName = 'com.cnblogs.yjmyzz.mongo.Application'
其實關鍵的只有一行:
compile 'org.springframework.data:spring-data-mongodb:1.8.4.RELEASE'
4.2 spring配置文件
1 <?xml version="1.0" encoding="UTF-8"?> 2 <beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xmlns:mongo="http://www.springframework.org/schema/data/mongo" 5 xsi:schemaLocation= 6 "http://www.springframework.org/schema/data/mongo 7 http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd 8 http://www.springframework.org/schema/beans 9 http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> 10 11 <mongo:db-factory id="mongoDbFactory" 12 host="localhost" 13 port="27017" 14 dbname="yjmyzz" 15 username="admin" 16 password="123456"/> 17 18 <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate"> 19 <constructor-arg name="mongoDbFactory" ref="mongoDbFactory"/> 20 </bean> 21 22 </beans>
4.3 定義Model
package com.cnblogs.yjmyzz.mongo.model;
import org.springframework.data.annotation.Id;
public class Customer {
@Id
private String id;
private String firstName;
private String lastName;
public Customer() {}
public Customer(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
@Override
public String toString() {
return "Customer{" +
"id='" + id + '\'' +
", firstName='" + firstName + '\'' +
", lastName='" + lastName + '\'' +
'}';
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
4.4 定義DAO接口
package com.cnblogs.yjmyzz.mongo.repository;
import com.cnblogs.yjmyzz.mongo.model.Customer;
import org.springframework.data.mongodb.repository.MongoRepository;
import java.util.List;
public interface CustomerRepository extends MongoRepository<Customer, String> {
public Customer findByFirstName(String firstName);
public List<Customer> findByLastName(String lastName);
}
這里有一些默認的約定要理解,比如上面的findByLastName這個方法,執行時會自動按Customer的lastName屬性來find數據。更詳細的方法名與類屬性的默認約定,可參考:http://docs.spring.io/spring-data/data-mongo/docs/1.8.4.RELEASE/reference/html/
4.5 Application使用示例
package com.cnblogs.yjmyzz.mongo;
import com.cnblogs.yjmyzz.mongo.model.Customer;
import com.cnblogs.yjmyzz.mongo.repository.CustomerRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ImportResource;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import java.util.List;
@Configurable()
@SpringBootApplication
@ImportResource("classpath:spring-context.xml")
public class Application implements CommandLineRunner {
@Autowired
private CustomerRepository repository;
@Autowired
MongoTemplate mongoTemplate;
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
// ApplicationContext ctx = SpringApplication.run(Application.class, args);
//
// System.out.println("getBeanDefinitionNames ==> ");
// for (String beanName : ctx.getBeanDefinitionNames()) {
// System.out.println(beanName);
// }
// System.out.println("<==");
}
@Override
public void run(String... args) throws Exception {
repository.deleteAll();
// save a couple of customers
repository.save(new Customer("Alice", "Smith"));
repository.save(new Customer("Bob", "Smith"));
repository.save(new Customer("張", "三"));
repository.save(new Customer("李", "四"));
repository.save(new Customer("王", "五"));
repository.save(new Customer("趙", "六"));
repository.save(new Customer("周", "七"));
repository.save(new Customer("楊", "八"));
// fetch all customers
System.out.println("Customers found with findAll():");
System.out.println("-------------------------------");
for (Customer customer : repository.findAll()) {
System.out.println(customer);
}
System.out.println();
// fetch an individual customer
System.out.println("Customer found with findByFirstName('Alice'):");
System.out.println("--------------------------------");
System.out.println(repository.findByFirstName("Alice"));
System.out.println("Customers found with findByLastName('Smith'):");
System.out.println("--------------------------------");
for (Customer customer : repository.findByLastName("Smith")) {
System.out.println(customer);
}
System.out.println("分頁測試==>");
Page<Customer> pageData = repository.findAll(new PageRequest(0, 4));
for (Customer c : pageData) {
System.out.println(c);
}
System.out.println("----------");
System.out.println(String.format("第%d頁 , 總頁數:%d , 總記錄數:%d , %d條/頁",
pageData.getNumber() + 1,
pageData.getTotalPages(),
pageData.getTotalElements(),
pageData.getSize()
));
//按條件動態查詢
Customer c = mongoTemplate.findOne(new Query(Criteria.where("firstName").is("楊")), Customer.class);
System.out.println(c);
System.out.println("----------");
List<Customer> list = mongoTemplate.find(new Query(Criteria.where("firstName").in("李","趙")), Customer.class);
for (Customer item : list) {
System.out.println(item);
}
}
}
github上已經開源了該項目:https://github.com/yjmyzz/spring-mongo-sample 供有需要的同學參考
