Mongo数据类型
在Mongodb中,可以使用数字代码和别名作为过滤条件查询文档。在聚合操作中,可以获取字段类型的别名。或者根据返回的字段类型实现不同的逻辑。
//使用字符串"array"和数字类型4查询字段类型是数组的数据
db.collection.find({<field_name>: {$type: "array"}})
db.collection.find({<field_name>: {$type: 4}})
db.collection.find({ "last_update_time": { $type: 18 } }).limit(1);
Mongo 命令行操作:
# 进入
mongo
# 切库
use msip
# 登录
db.auth('username','password');
# 展示库
show dbs
# 展示表
show collections;
# 删除
db.集合名.drop()
# 退出
exit
# 插入文档
db.集合名.insert({键: 值, 键: 值, ...})
# 查询文档
db.集合名.find({查询条件})
# 更新文档
db.集合名.update({查询条件}, {$set: {更新内容}})
# 删除文档
db.集合名.remove({查询条件})
# 更新多条数据,开发环境自己修改数据类型使用;
# 0 默认插入是double,必须使用 NumberInt,时间属性可以使用new Date(),也可以使用时间戳 $currentDate,也可以使用NumberLong
db.bindboxes.updateMany(
{},
{
$set: {
type: NumberInt(0),
last_update_time: NumberLong('1732259866059')
}
},
{ upsert: true }
);
# mongoDB添加用户密码
db.createUser({user:"admin",pwd:"1qaz!QAZ",roles:["root"]})
db.createUser({user:"douzi",pwd:"123456",roles:["readWriteAnyDatabase"]})
db.createUser({user:"douzi1",pwd:"123456",roles:["readWrite"]})
db.dropUser("douzi1")
mongodump --host=MongoDB服务器地址:端口号 --username=用户名 --password=密码 --db=数据库名称 --out=导出路径
mongodump --host=MongoDB服务器地址:端口号 --username=用户名 --password=密码 --db=数据库名称 --collection=集合名称 --out=导出路径
mongorestore -db 恢复后的数据库名称 待恢复数据的目录路径
mongo url解析
# 单机连接url
mongodb://username:password@10.186.201.173:27017/认证db
# 集群连接url
mongo_url: "mongodb://username:password@douzi1:27017,douzi2:27017,douzi3:27017/认证db?replicaSet=yulancard&readPreference=secondaryPreferred&authSource=msip"
1.readPreference: secondaryPreferred #主要控制客户端driver从副本集(Replica Set)读数据的时候如何路由
- primary:只主(默认模式)。只从primary节点读数据。
- primaryPreferred:先主后从。优先从primary读取,primary不可用时从secondary读。
- secondary:只从。只从副本集中secondary节点读数据。
- secondaryPreferred:先从后主。优先从secondary读取,如果secondary不可用时就从primary读。
- nearest:就近。根据网络距离,就近读取,根据客户端与服务端的PingTime是实现。
2.replicaSet: yulancard #指定提供的连接字符串包括多个主机。如果指定,驱动程序将尝试查找该集合的所有成员
Java 连接 mongodb:
介绍一个新东西,mongo-plus:前言 | MongoPlus
Mongo-Plus(简称 MP)是一个 MongoDB 的操作工具,可和现有mongoDB框架结合使用,为简化开发、提高效率而生。
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 5 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持自定义全局通用操作:支持全局通用方法注入
- 支持无实体类情况下的操作
- 支持动态数据源
- 支持逻辑删除、防止全集合更新和删除、自动填充等等功能
项目maven引用
<dependency>
<groupId>com.gitee.anwena</groupId>
<artifactId>mongo-plus-boot-starter</artifactId>
<version>2.1.4</version>
</dependency>
代码结构:
配置项,包括多数据源
通过本机一个库不同的集合模拟,如果生产环境多组集群数据源;还需要增加:
mongo_url: "mongodb://username:password@douzi1:27017,douzi2:27017,douzi3:27017/认证db?replicaSet=yulancard&readPreference=secondaryPreferred&authSource=msip"
replicaSet、readPreference配置,详见 配置文件 | MongoPlus
# DataSource Config
mongo-plus:
group: 3 #代表有几组mongodb,最多现网4组,业务代码使用
data:
mongodb:
host: 127.0.0.1 #ip,集群通过英文逗号分隔
port: 27017 #端口,集群通过英文逗号分隔
database: testDb #数据库名
username: #用户名,没有可不填(若账号中出现@,!等等符号,不需要再进行转码!!!)
password: #密码,同上(若密码中出现@,!等等符号,不需要再进行转码!!!)
authenticationDatabase: testDb #验证数据库,非常重要,不配默认连接admin库
connectTimeoutMS: 50000 #在超时之前等待连接打开的最长时间(以毫秒为单位)
slave-data-source:
- slave-name: slave1 # 数据源名称,注解@MongoDs使用
host: 127.0.0.1 #ip,集群通过英文逗号分隔
port: 27017 #集群通过英文逗号分隔
database: testDb1
connectTimeoutMS: 50000
username: #用户名,没有可不填(若账号中出现@,!等等符号,不需要再进行转码!!!)
password: #密码,同上(若密码中出现@,!等等符号,不需要再进行转码!!!)
authenticationDatabase: testDb #验证数据库,非常重要,不配默认连接admin库
- slave-name: slave2 # 数据源名称 注解@MongoDs使用
host: 127.0.0.1 #ip,集群通过英文逗号分隔
port: 27017 #集群通过英文逗号分隔
database: testDb2
connectTimeoutMS: 50000
username: #用户名,没有可不填(若账号中出现@,!等等符号,不需要再进行转码!!!)
password: #密码,同上(若密码中出现@,!等等符号,不需要再进行转码!!!)
authenticationDatabase: testDb #验证数据库,非常重要,不配默认连接admin库
log: true
format: true
pretty: true
configuration:
collection:
block-attack-inner: true #开启防止整个集合更新和删除(防止全表更新删除)
autoConvertObjectId: true #自动转换ObjectId配置
通过注解执行不同的数据源取数据
其他代码:
1.根据数据库结构构建domain
2.直接创建service类,并且啥都不用写,框架已经封装所有操作方法
3.业务使用,类似mybatis-plus语法
注意:对于异常数据处理
有人在插入数据的时候,根本不注意数据类型。
例如会把 new Date().getTime() long值 存成 double;
对于现实遇到此情况,代码也是可以处理的:
Long dateTime = new Date().getTime();
Double dataTimeD = dateTime.doubleValue();
// 然后在传入我们的查询条件中,即可查询:
lqc.lt(dataTimeD != null, BindBoxes::getLastUpdateTime, dataTimeD);
// 如果要格式化此属性:
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss");
if (bb.getLastUpdateTime() != null) {
String updateTime = dateFormat.format(bb.getLastUpdateTime());
System.out.println(updateTime);
}