一、时区问题
mongodb里存储的date比正常时间少8小时,那是因为它用的是格林尼治时间,new Date()的时候创建的是本地时间(北京时间),位于东八区,springboot配置里添加如下配置即可指定时区和返回的日期的格式:
#处理时区问题
spring.jackson.date-format=yyyy-MM-dd HH:mm:ss.SSS
spring.jackson.time-zone=GMT+8
在从mongodb里查出来数据的时候,会自动转换成本地时间(java自己做的事儿)。也就是程序里new Date()的时候比如是(北京时间)2020-06-20 18:20:20.123 到了mongodb里就变成了(格林尼治时间)2020-06-20 10:20:20.123 ,接着查出来的数据会自动处理成本地时间2020-06-20 18:20:20.123,造成的影响仅仅是通过脚本查看数据库数据的时间,java会自动处理成本地时间,这个无需自己处理,要想统一化,就用String类型的时间或者long类型的时间(使用long存储的时候不太友好,一串数字谁知道是猴年马月)。
MongoDB公司比较无所谓,不给设置时区,所以统一都是格林尼治时间。。。(此处应该拉出去批评10分钟)
二、数据库同步工具
1、MongoShake
阿里巴巴的 MongoShake ,目前可以支持到MongoDB4.X(我测试从mongodb3.2.16同步数据到mongodb4.0.4没问题)
延迟2s左右
官方地址: https://github.com/alibaba/MongoShake
中文介绍地址: MongoShake——基于MongoDB的跨数据中心的数据复制平台-阿里云开发者社区
2、mongosync
mongosync下载地址:
http://dl.nosqldb.org/mongosync
使用手册:
http://dl.nosqldb.org/mongosync_user_guide_zh_CN.pdf
3、Change Streams
构建实时同步数据流完美数据迁移-MongoDB Stream的应用-腾讯云开发者社区-腾讯云
4、Magisync
5、kettle
官网:http://wiki.pentaho.com/display/EAI/MongoDB+Input
三、关于索引
MongoDB的索引不像MySQL那样有最左原则(MySQL的最左原则:有索引 abcIndexMysql(a,b,c)查询语句命中a,ab,abc皆可以走索引,但是跳过a或者ab就无法走索引,详细介绍MySQL索引相关请点击快速通道:闪现一下你就知道),MongoDB的索引是由搜索引擎自动优化的,可以跳过前边若干个比如:有索引 abcIndexMongoDB(a,b,c),不管你怎么写查询,只要包含在a,b,c中就可以了,方便吧,省心吧,就问你爽不爽。
四、关于存储内容
非关系型的数据库知道吧,不用行列对应那么整齐,同一个collection中第一行你想存name,age,gender可以有,第二行你想存name,price,address,phone,也可以,不过虽然是非关系型的,也不能乱用,最好是每个collection存放一类数据,只是这类数据需要存储的字段可能有些差异(大致相同),存储结构是类似于json数据结构的bson,存储的数据可以用JSONObject接收,也可以映射成实体,看具体需求吧,就是MongoDB的语句和api用起来比较有挑战,特别是遇见复杂的查询的时候,比如MySQL里边的A and B and C and (D or E)猜猜MongoDB里边怎么写?api又怎么拼装?这个找一个专题来写吧,详情请关注 MongoDB的增删改查语法和api的使用