面向小白的Ractive方式访问Mongo

129 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情

昨天玩了一下redis,今天我们来玩一下mongo。

搞配置

我们要操作mongo,所以需要mongo的支持,数据是从数据库查的,所以需要jdbc的支持,我们需要导入依赖:

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

需要指定mongo的位置spring.data.mongodb.uri

搞代码

我们需要一个转换器,因为我们在mongo存的时候是存的是long类型,但取的时候我们要转换成money类型,这样方便我们后续进行操作。

所以,聪明的读者想到了,我们需要一个转换器convertor

public class MoneyReadConverter implements Converter<Long, Money> {
    @Override
    public Money convert(Long aLong) {
        return Money.ofMinor(CurrencyUnit.of("CNY"), aLong);
    }
}
public class MoneyWriteConverter implements Converter<Money, Long> {
    @Override
    public Long convert(Money money) {
        return money.getAmountMinorLong();
    }
}

这是SpringBoot MongoCustomConversions自定义转换类,我们把搞好的转换器放进去,转换的时候就能找到这两个转换器。

@Bean
public MongoCustomConversions mongoCustomConversions() {
   return new MongoCustomConversions(
         Arrays.asList(new MoneyReadConverter(),
               new MoneyWriteConverter()));
}

搞了一个初始化的数据,两个种类的咖啡

image.png

然后把这两个数据,塞到我们的mongo中。

mongoTemplate.insertAll(initCoffee())

然后进行发布,发布执行publishOn方法

.publishOn(Schedulers.elastic())

接着会看到我们两个next操作的日志

.doOnNext(c -> log.info("Next: {}", c))

完成之后,我们执行一个ok

.doOnComplete(runnable)

这个任务就是打印个ok

() -> log.info("ok")

结束之后,把任务减1然后打印个最终日志

.doFinally(s -> {
   cdl.countDown();
   log.info("Finnally 1, {}", s);
})

然后我们进行一个数量统计

.count()

然后我们进行订阅,打印这个数量

.subscribe(c -> log.info("Insert {} records", c));

运行结果

和我说的一样吧,两个next之后是一个ok,当然你还可以调用别的方法,这里可以有非常多的实现可能,然后我们还看到这里是两个线程执行的:主线程和elastic线程。主线程主要是打印一个after starting日志,然后等待子线程任务完成,最后结束。

image.png

哈哈,是不是很简单,你学会了吗?