• 寻找mongo之一


    我从mariadb mysql oracle postgrelsql 了解到mongo
    当然它们之间是有不同点的

    如上图一样,table的每个数据元组和mongo存储的json是不同的

    简单地跟着朋友推荐的极客时间做了个demo
    如下:

    引入mongodb依赖,这里说明mongodb还有一个reactive类型的依赖/包括redis也有一种

    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-mongodb</artifactId>
    		</dependency>
    
    

    那么上面提到的mongodb的reactive的依赖如下:

    		<dependency>
    			<groupId>org.springframework.boot</groupId>
    			<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
    		</dependency>
    

    什么是reactive,即响应式编程
    https://www.jianshu.com/p/c95e29854cb1
    https://baike.baidu.com/item/响应式编程/15549849?fr=aladdin

    https://zhuanlan.zhihu.com/p/27678951 <<

    传统mongo

    package geektime.spring.data.mongodemo;
    
    import com.mongodb.client.result.UpdateResult;
    import geektime.spring.data.mongodemo.converter.MoneyReadConverter;
    import geektime.spring.data.mongodemo.model.Coffee;
    import lombok.extern.slf4j.Slf4j;
    import org.joda.money.CurrencyUnit;
    import org.joda.money.Money;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.mongodb.core.MongoTemplate;
    import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
    import org.springframework.data.mongodb.core.query.Criteria;
    import org.springframework.data.mongodb.core.query.Query;
    import org.springframework.data.mongodb.core.query.Update;
    
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    import static org.springframework.data.mongodb.core.query.Query.query;
    
    @SpringBootApplication
    @Slf4j
    public class MongoDemoApplication implements ApplicationRunner {
    	@Autowired
    	private MongoTemplate mongoTemplate;
    
    	public static void main(String[] args) {
    		SpringApplication.run(MongoDemoApplication.class, args);
    	}
    
    	@Bean
    	public MongoCustomConversions mongoCustomConversions() {
    		return new MongoCustomConversions(Arrays.asList(new MoneyReadConverter()));
    	}
    
    	@Override
    	public void run(ApplicationArguments args) throws Exception {
    		Coffee espresso = Coffee.builder()
    				.name("espresso")
    				.price(Money.of(CurrencyUnit.of("CNY"), 20.0))
    				.createTime(new Date())
    				.updateTime(new Date()).build();
    		Coffee saved = mongoTemplate.save(espresso);
    		log.info("Coffee {}", saved);
    
    		List<Coffee> list = mongoTemplate.find(
    				Query.query(Criteria.where("name").is("espresso")), Coffee.class);
    		log.info("Find {} Coffee", list.size());
    		list.forEach(c -> log.info("Coffee {}", c));
    
    		Thread.sleep(1000); // 为了看更新时间
    		UpdateResult result = mongoTemplate.updateFirst(query(where("name").is("espresso")),
    				new Update().set("price", Money.ofMajor(CurrencyUnit.of("CNY"), 30))
    						.currentDate("updateTime"),
    				Coffee.class);
    		log.info("Update Result: {}", result.getModifiedCount());
    		Coffee updateOne = mongoTemplate.findById(saved.getId(), Coffee.class);
    		log.info("Update Result: {}", updateOne);
    
    		mongoTemplate.remove(updateOne);
    	}
    }
    
    
    

    响应式mongo

    package geektime.spring.data.reactive.mongodbdemo;
    
    import geektime.spring.data.reactive.mongodbdemo.converter.MoneyReadConverter;
    import geektime.spring.data.reactive.mongodbdemo.converter.MoneyWriteConverter;
    import geektime.spring.data.reactive.mongodbdemo.model.Coffee;
    import lombok.extern.slf4j.Slf4j;
    import org.joda.money.CurrencyUnit;
    import org.joda.money.Money;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.ApplicationArguments;
    import org.springframework.boot.ApplicationRunner;
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.annotation.Bean;
    import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
    import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
    import org.springframework.data.mongodb.core.query.Update;
    import reactor.core.scheduler.Schedulers;
    
    import java.util.Arrays;
    import java.util.Date;
    import java.util.List;
    import java.util.concurrent.CountDownLatch;
    
    import static org.springframework.data.mongodb.core.query.Criteria.where;
    import static org.springframework.data.mongodb.core.query.Query.query;
    
    @SpringBootApplication
    @Slf4j
    public class MongodbDemoApplication implements ApplicationRunner {
    	@Autowired
    	private ReactiveMongoTemplate mongoTemplate;
    	private CountDownLatch cdl = new CountDownLatch(2);
    
    	public static void main(String[] args) {
    		SpringApplication.run(MongodbDemoApplication.class, args);
    	}
    
    	@Bean
    	public MongoCustomConversions mongoCustomConversions() {
    		return new MongoCustomConversions(
    				Arrays.asList(new MoneyReadConverter(),
    						new MoneyWriteConverter()));
    	}
    
    	@Override
    	public void run(ApplicationArguments args) throws Exception {
    //		startFromInsertion(() -> log.info("Runnable"));
    		startFromInsertion(() -> {
    			log.info("Runnable");
    			decreaseHighPrice();
    		});
    
    		log.info("after starting");
    
    //		decreaseHighPrice();
    
    		cdl.await();
    	}
    
    	private void startFromInsertion(Runnable runnable) {
    		mongoTemplate.insertAll(initCoffee())
    				.publishOn(Schedulers.elastic())
    				.doOnNext(c -> log.info("Next: {}", c))
    				.doOnComplete(runnable)
    				.doFinally(s -> {
    					cdl.countDown();
    					log.info("Finnally 1, {}", s);
    				})
    				.count()
    				.subscribe(c -> log.info("Insert {} records", c));
    	}
    
    	private void decreaseHighPrice() {
    		mongoTemplate.updateMulti(query(where("price").gte(3000L)),
    				new Update().inc("price", -500L)
    						.currentDate("updateTime"), Coffee.class)
    				.doFinally(s -> {
    					cdl.countDown();
    					log.info("Finnally 2, {}", s);
    				})
    				.subscribe(r -> log.info("Result is {}", r));
    	}
    
    	private List<Coffee> initCoffee() {
    		Coffee espresso = Coffee.builder()
    				.name("espresso")
    				.price(Money.of(CurrencyUnit.of("CNY"), 20.0))
    				.createTime(new Date())
    				.updateTime(new Date())
    				.build();
    		Coffee latte = Coffee.builder()
    				.name("latte")
    				.price(Money.of(CurrencyUnit.of("CNY"), 30.0))
    				.createTime(new Date())
    				.updateTime(new Date())
    				.build();
    
    		return Arrays.asList(espresso, latte);
    	}
    }
    
    
  • 相关阅读:
    一些图形API函数收录
    VC6.0常见编译错误及解决方法
    Google Test Primer(入门)(六) 结束部分
    转帖:C++程序内存泄露检测
    Google Test Primer(四)——简单测试
    Android Snippet
    DCAApp 和 DXPApp 类的探索
    WEB(Javascript)远程调用方案清单
    做一个treeview dropdownlist 最近会放上来
    DotLucene:37行代码全文搜索
  • 原文地址:https://www.cnblogs.com/ukzq/p/13546849.html
Copyright © 2020-2023  润新知