我从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);
}
}