MongoDB开发基础

MongoDB安装

1. 官网下载安装介质:https://www.mongodb.com/download-center,选择适当的版本,这里以linux版本为例;
2. 解压到系统某路径, tar -xvzf mongodb-linux-x86_64-rhel70-3.4.10.tgz并在安装目录创建data目录,以及logs目录和logs/mongodb.log文件
3. 使用vim在mongodb的bin目录创建mongodb的配置文件,如:vimbin/mongodb.conf,mongodb.conf内容请见下一页课件;
4. 编写shell脚本,命名为start-mongodb.sh,脚本内容如下:nohup ./mongod -f mongodb.conf &
5. 使用start-mongodb.sh启动mongodb实例,如:./start-mongodb
6. 使用mongoClient进行测试  通过restAPI地址测试(端口加配置文件的端扣加1000)

 http://192.168.225.129:28022/listDatabases?text=1

连接客户端命令  在bin下执行

./mongo localhost:27022

配置文件

storage:
    dbPath: "/usr/local/apache/mongoDB/mongodb-linux-x86_64-rhel70-3.4.10/data"
systemLog:
    destination: file
    path: "/usr/local/apache//mongoDB/mongodb-linux-x86_64-rhel70-3.4.10/logs/mongodb.log"
net:
    port: 27022
    http:
        RESTInterfaceEnabled: true
processManagement:
    fork: false

MongoDB配置文件详解

 

快速入门

数据结构介绍

 人员信息

{
    "_id" : ObjectId("59f938235d93fc4af8a37114"),
    "username" : “lison",
    "country" : "in11digo",
    "address" : {
        "aCode" : "邮编",
        "add" : "d11pff"
    },
    "favorites" : {
    "movies" : ["杀破狼2","1dushe","雷神1"],
    "cites" : ["1sh","1cs","1zz"]
    },
    "age" : 18,
    "salary":NumberDecimal("2.099"),
    "lenght" :1.79
}

需求描述

 新增2人
 删除
     delete from users where username = ‘lison’
     delete from users where age >8 and age <25
 修改
     update users set age=6 where username = lison'
     update users set favorites.movies add "小电影2 ", "小电影3" where favorites.cites has "东莞"
 查询
     select * from users where favorites.cites has "东莞"、"东京"
     select * from users where username like '%s%' and (country= English or country= USA)

学习目标

 直观感受mongoDB的魅力
 mongo开发入门(原生、spring)
 开发框架版本选择
 mongoDB数据类型全解析
 对nosql的理念有初步的认识

mongoDB  客户端 & 图形化界面

 mongoDB自带的命令客户端 mongo
 mongoDB自带的图形化客户端:Compass Community
 第三方mongoDB的图形化客户端:robomongo

6c79fcddb1ef9710215e92d2bea127611ef.jpg

原生java客户端

 pom文件

<dependency>
    <groupId>org.mongodb</groupId>
    <artifactId>mongo-java-driver</artifactId>
    <version>3.5.0</version>
</dependency>

Tips:
1. 3.5.0最新版本加入了对pojo的支持;
2. 3.5.0最新版本增强对json的支持;
3. mongodb原生客户端支持两种document和pojo模式的开发;

//原生java驱动 document的操作方式
public class QuickStartJavaDocTest {

	private static final Logger logger = LoggerFactory.getLogger(QuickStartJavaDocTest.class);
	
    private MongoDatabase db;
    
    private MongoCollection<Document> doc;
    
    private MongoClient client;
	
	
    @Before
    public void init(){
    	client = new MongoClient("192.168.225.129",27022);
    	db =client.getDatabase("test");
    	doc = db.getCollection("users");
    }
    
    @Test
    public void insertDemo(){
    	Document doc1 = new Document();
    	doc1.append("username", "cang");
    	doc1.append("country", "USA");
    	doc1.append("age", 20);
    	doc1.append("lenght", 1.77f);
    	doc1.append("salary", new BigDecimal("6565.22"));
    	
    	Map<String, String> address1 = new HashMap<String, String>();
    	address1.put("aCode", "0000");
    	address1.put("add", "xxx000");
    	doc1.append("address", address1);
    	
    	Map<String, Object> favorites1 = new HashMap<String, Object>();
    	favorites1.put("movies", Arrays.asList("aa","bb"));
    	favorites1.put("cites", Arrays.asList("东莞","东京"));
    	doc1.append("favorites", favorites1);
    	
    	Document doc2  = new Document();
    	doc2.append("username", "chen");
    	doc2.append("country", "China");
    	doc2.append("age", 30);
    	doc2.append("lenght", 1.77f);
    	doc2.append("salary", new BigDecimal("8888.22"));
    	Map<String, String> address2 = new HashMap<>();
    	address2.put("aCode", "411000");
    	address2.put("add", "我的地址2");
    	doc1.append("address", address2);
    	Map<String, Object> favorites2 = new HashMap<>();
    	favorites2.put("movies", Arrays.asList("东游记","一路向东"));
    	favorites2.put("cites", Arrays.asList("珠海","东京"));
    	doc2.append("favorites", favorites2);
    	
    	doc.insertMany(Arrays.asList(doc1,doc2));
    	
    }
    
    @Test
    public void testDelete(){
    	
    	//delete from users where username = ‘lison’
    	DeleteResult deleteMany = doc.deleteMany(eq("username", "lison"));
    	logger.info(String.valueOf(deleteMany.getDeletedCount()));
    	
    	//delete from users where age >8 and age <25
    	DeleteResult deleteMany2 = doc.deleteMany(and(gt("age",8),lt("age",25)));
    	logger.info(String.valueOf(deleteMany2.getDeletedCount()));
    }
    
    @Test
    public void testUpdate(){
    	//update  users  set age=6 where username = 'lison'      $set 如果不带$ 表示覆盖整个数据   带$表示覆盖指定列
    	UpdateResult updateMany = doc.updateMany(eq("username", "lison"),new Document("$set",new Document("age",6)));
    	logger.info(String.valueOf(updateMany.getModifiedCount()));
    	
    	//update users  set favorites.movies add "小电影2 ", "小电影3" where favorites.cites  has "东莞"
    	UpdateResult updateMany2 = doc.updateMany(eq("favorites.cites", "东莞"), addEachToSet("favorites.movies", Arrays.asList( "小电影2 ", "小电影3")));
    	logger.info(String.valueOf(updateMany2.getModifiedCount()));
    }
    
    @Test
    public void testFind(){
    	final List<Document> ret = new ArrayList<>();
    	Block<Document> printBlock = new Block<Document>() {
			@Override
			public void apply(Document t) {
				logger.info(t.toJson());
				ret.add(t);
			}
    		
		};   	
    	//select * from users  where favorites.cites has "东莞"、"东京"
		FindIterable<Document> find = doc.find(all("favorites.cites", Arrays.asList("东莞","东京")));
		find.forEach(printBlock);
		logger.info(String.valueOf(ret.size()));
		ret.removeAll(ret);
    	
    	
    	//select * from users  where username like '%s%' and (contry= English or contry = USA)
		String regexStr = ".*s.*";
		Bson regex = regex("username", regexStr);
		Bson or = or(eq("country","English"),eq("country","USA"));
		FindIterable<Document> find2 = doc.find(and(regex,or));
		find2.forEach(printBlock);
		logger.info(String.valueOf(ret.size()));

    }

}
//原生java驱动 Pojo的操作方式
public class QuickStartJavaPojoTest {

	private static final Logger logger = LoggerFactory.getLogger(QuickStartJavaPojoTest.class);
	
    private MongoDatabase db;
    
    private MongoCollection<User> doc;
    
    private MongoClient client;
	
	
    @Before
    public void init(){
    	//编解ma器的list
    	List<CodecRegistry> codecResgistes = new ArrayList<>();
    	//编解ma器的list加入默认的编解ma器结合
    	codecResgistes.add(MongoClient.getDefaultCodecRegistry());
    	//生成一个pojo的编解ma器
    	CodecRegistry pojoProviders = CodecRegistries.
    			fromProviders(PojoCodecProvider.builder().automatic(true).build());
    	
    	codecResgistes.add(pojoProviders);
    	//通过编解ma器的list生成编解ma器注册中心
    	CodecRegistry registry = CodecRegistries.fromRegistries(codecResgistes);
    	
    	//把编解ma器注册中心放入MongoClientOptions
    	MongoClientOptions build = MongoClientOptions.builder().codecRegistry(registry).build();

    	ServerAddress serverAddress = new ServerAddress("192.168.225.129",27022);

		client = new MongoClient(serverAddress, build);

    	db =client.getDatabase("test");
    	doc = db.getCollection("users",User.class);
    }
    
    @Test
    public void insertDemo(){
    	User user = new User();
    	user.setUsername("cang");
    	user.setCountry("USA");
    	user.setAge(20);
    	user.setLenght(1.77f);
    	user.setSalary(new BigDecimal("6265.22"));
    	Address address1 = new Address();
    	address1.setaCode("411222");
    	address1.setAdd("sdfsdf");
    	user.setAddress(address1);
    	Favorites favorites1 = new Favorites();
    	favorites1.setCites(Arrays.asList("东莞","东京"));
    	favorites1.setMovies(Arrays.asList("西游记","一路向西"));
    	user.setFavorites(favorites1);
    	
    	
    	User user1 = new User();
    	user1.setUsername("chen");
    	user1.setCountry("China");
    	user1.setAge(30);
    	user1.setLenght(1.77f);
    	user1.setSalary(new BigDecimal("6885.22"));
    	Address address2 = new Address();
    	address2.setaCode("411000");
    	address2.setAdd("我的地址2");
    	user1.setAddress(address2);
    	Favorites favorites2 = new Favorites();
    	favorites2.setCites(Arrays.asList("珠海","东京"));
    	favorites2.setMovies(Arrays.asList("东游记","一路向东"));
    	user1.setFavorites(favorites2);
    	
    	
    	
    	doc.insertMany(Arrays.asList(user,user1));
    	
    }
    
    @Test
    public void testDelete(){
    	
    	//delete from users where username = ‘lison’
    	
    	DeleteResult deleteMany = doc.deleteMany(eq("username", "chen"));
    	logger.info(String.valueOf(deleteMany.getDeletedCount()));
    	
    	//delete from users where age >8 and age <25
    	DeleteResult deleteMany2 = doc.deleteMany(and(gt("age",8),lt("age",25)));
    	logger.info(String.valueOf(deleteMany2.getDeletedCount()));
    }
    
    @Test
    public void testUpdate(){
    	//update  users  set age=6 where username = 'lison' 
    	UpdateResult updateMany = doc.updateMany(eq("username", "cang"), 
    			                  new Document("$set",new Document("age",6)));
    	logger.info(String.valueOf(updateMany.getModifiedCount()));
    	
    	//update users  set favorites.movies add "小电影2 ", "小电影3" where favorites.cites  has "东莞"
    	UpdateResult updateMany2 = doc.updateMany(eq("favorites.cites", "东莞"), 
    			                                  addEachToSet("favorites.movies", Arrays.asList( "小电影2 ", "小电影3")));
    	logger.info(String.valueOf(updateMany2.getModifiedCount()));
    }
    
    @Test
    public void testFind(){
    	
    	final List<User> ret = new ArrayList<>();
    	Block<User> printBlock = new Block<User>() {
			@Override
			public void apply(User t) {
				System.out.println(t.getUsername());
				System.out.println(t.getSalary());
				ret.add(t);
			}
    		
		};
		
    	//select * from users  where favorites.cites has "东莞"、"东京"
		FindIterable<User> find = doc.find(all("favorites.cites", Arrays.asList("东莞","东京")));
		find.forEach(printBlock);
		logger.info(String.valueOf(ret.size()));
		ret.removeAll(ret);
    	
    	
    	//select * from users  where username like '%s%' and (contry= English or contry = USA)
		String regexStr = ".*s.*";
		Bson regex = regex("username", regexStr);
		Bson or = or(eq("country","English"),eq("country","USA"));
		FindIterable<User> find2 = doc.find(and(regex,or));
		find2.forEach(printBlock);
		logger.info(String.valueOf(ret.size()));

    }
    
}

Spring-data-mongodb客户端

pom文件

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-mongodb</artifactId>
    <version>1.10.9.RELEASE</version>
</dependency>

Tips:
1. spring-data-mongodb的最新版本是2.x.x,如果是spring为5.0版本以上的才推荐使用;
2. spring-data-mongodb的1.10.9版本基于spring4.3.x开发,但是默认依赖的mongodb驱动为2.14.3,可以将mongodb的驱动设置为3.5.0的版本,兼容性待进一步测试;
3. spring-data-mongodb的1.10.9可能会支持3.5.0版本 mongodb驱动;
4. spring-data-mongodb一般使用pojo的方式开发;

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:mongo="http://www.springframework.org/schema/data/mongo"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/data/mongo http://www.springframework.org/schema/data/mongo/spring-mongo.xsd">

	<!-- <context:property-placeholder location="classpath:/com/myapp/mongodb/config/mongo.properties" 
		/> -->
	<!-- mongodb连接池配置 -->
	<mongo:mongo-client host="192.168.225.129" port="27022">
		<mongo:client-options 
		      write-concern="ACKNOWLEDGED"
		      connections-per-host="100"
		      threads-allowed-to-block-for-connection-multiplier="5"
		      max-wait-time="120000"
			  connect-timeout="10000"/> 
	</mongo:mongo-client>
	
	<!-- mongodb数据库工厂配置 -->
	<mongo:db-factory dbname="test" mongo-ref="mongo" />

    <!-- mongodb模板配置 -->
	<bean id="anotherMongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
		<constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
		 <!-- <constructor-arg name="mongoConverter" ref="mappingConverter"/> -->
		<property name="writeResultChecking" value="EXCEPTION"></property>
	</bean>

</beans>
@Document(collection="users")
public class User {
	
	private ObjectId id;
		
	private String username;
	
	private String country;
	
	private Address address;
	
	private Favorites favorites;
	
	private int age;
	
	private BigDecimal salary;
	
	private float lenght;
	
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getCountry() {
		return country;
	}
	public void setCountry(String country) {
		this.country = country;
	}
	public Address getAddress() {
		return address;
	}
	public void setAddress(Address address) {
		this.address = address;
	}
	public Favorites getFavorites() {
		return favorites;
	}
	public void setFavorites(Favorites favorites) {
		this.favorites = favorites;
	}
	public ObjectId getId() {
		return id;
	}
	public void setId(ObjectId id) {
		this.id = id;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public BigDecimal getSalary() {
		return salary;
	}
	public void setSalary(BigDecimal salary) {
		this.salary = salary;
	}
	public float getLenght() {
		return lenght;
	}
	public void setLenght(float lenght) {
		this.lenght = lenght;
	}
	
}
//spring Pojo的操作方式
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class QuickStartSpringPojoTest {

	private static final Logger logger = LoggerFactory.getLogger(QuickStartSpringPojoTest.class);
	
	@Resource
	private MongoOperations tempelate;
    

    @Test
    public void insertDemo(){
    	User user = new User();
    	user.setUsername("cang");
    	user.setCountry("USA");
    	user.setAge(20);
    	user.setLenght(1.77f);
    	user.setSalary(new BigDecimal("6265.22"));
    	Address address1 = new Address();
    	address1.setaCode("411222");
    	address1.setAdd("sdfsdf");
    	user.setAddress(address1);
    	Favorites favorites1 = new Favorites();
    	favorites1.setCites(Arrays.asList("东莞","东京"));
    	favorites1.setMovies(Arrays.asList("西游记","一路向西"));
    	user.setFavorites(favorites1);
    	
    	
    	User user1 = new User();
    	user1.setUsername("chen");
    	user1.setCountry("China");
    	user1.setAge(30);
    	user1.setLenght(1.77f);
    	user1.setSalary(new BigDecimal("6885.22"));
    	Address address2 = new Address();
    	address2.setaCode("411000");
    	address2.setAdd("我的地址2");
    	user1.setAddress(address2);
    	Favorites favorites2 = new Favorites();
    	favorites2.setCites(Arrays.asList("珠海","东京"));
    	favorites2.setMovies(Arrays.asList("东游记","一路向东"));
    	user1.setFavorites(favorites2);
    	
    	tempelate.insertAll(Arrays.asList(user,user1));
    }
    
    @Test
    public void testDelete(){
    	
    	//delete from users where username = ‘lison’
    	WriteResult remove = tempelate.remove(query(where("username").is("cang ")), User.class);
    	System.out.println(remove.getN());
    	
    	//delete from users where age >8 and age <25
    	WriteResult remove2 = tempelate.remove(query(new Criteria().andOperator(where("age").gt(8),where("age").lt(25))), User.class);
    	System.out.println(remove2.getN());
    	
    }
    
    @Test
    public void testUpdate(){
    	//update  users  set age=6 where username = 'lison' 
    	WriteResult updateFirst = tempelate.updateMulti(query(where("username").is("chen")), update("age", 6), User.class);
    	System.out.println(updateFirst.getN());
    	//update users  set favorites.movies add "小电影2 ", "小电影3" where favorites.cites  has "东莞"
    	Query query = query(where("favorites.cites").is("东莞"));
		Update update = new Update().addToSet("favorites.movies").each("小电影2 ", "小电影3");
		WriteResult updateMulti = tempelate.updateMulti(query, update, User.class);
		System.out.println(updateMulti.getN());
    }
    
    @Test
    public void testFind(){
    	
    	//select * from users  where favorites.cites has "东莞"、"东京"
    	List<User> find = tempelate.find(query(where("favorites.cites").all(Arrays.asList("东莞","东京"))), User.class);
    	System.out.println(find.size());
    	
    	//select * from users  where username like '%s%' and (contry= EngLish or contry = USA)
    	String regexStr = ".*s.*";
    	//username like '%s%'
    	Criteria regex = where("username").regex(regexStr);
    	//contry= EngLish
    	Criteria or1 = where("country").is("English");
    	//contry= USA
    	Criteria or2 = where("country").is("USA");
    	
    	Criteria or = new Criteria().orOperator(or1,or2);
    	
    	Query query = query(new Criteria().andOperator(regex,or));
    	
    	List<User> find2 = tempelate.find(query, User.class);
    	
    	System.out.println(find2.size());

    }
    
}

 

开发框架版本选择

 java 驱动与mongoDB兼容性

ab81faade14bd07202d92ae485cbf9e68ad.jpg

开发框架版本选择

 java 驱动与jdk的兼容性

eaf0666711193e845d348639dfe62273576.jpg

开发框架版本选择

 spring data mongo 与java mongo驱动兼容性

a0c27d4854496e82592e6836ccf52ce699e.jpg

mongoDB数据类型

b609f675bdcb5356628d689e6293d0cf69f.jpg

 

转载于:https://my.oschina.net/u/3728166/blog/2050215

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值