好友
阅读权限10
听众
最后登录1970-1-1
|
MongoDB
-
MongoDB
- MongoDB体系结构:DataBase > Collection > Document
MongoDB数据类型
String 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。
Integer 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。
Boolean 布尔值。用于存储布尔值(真/假)。
Double 双精度浮点值。用于存储浮点值。
Min/Max keys 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。
Array 用于将数组或列表或多个值存储为一个键。
Timestamp 时间戳。记录文档修改或添加的具体时间。
Object 用于内嵌文档。
Null 用于创建空值。
Symbol 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。
Date 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。
Object ID 对象 ID。用于创建文档的 ID。
Binary Data 二进制数据。用于存储二进制数据。
Code 代码类型。用于在文档中存储 JavaScript 代码。
Regular expression 正则表达式类型。用于存储正则表达式。
MongoDB语法
创建/选择数据库 use <DatabaseName>
查看所有数据库 show dbs
查看所有集合 show collections
查看指定数据库 show <DatabaseName>
创建集合 db.createCollection(<CollectionName>, {options})
修改文档 db.<CollectionName>.update({条件},{修改后的数据})
删除当前数据库 db.dropDatabase()
删除集合 db.collection.drop()
插入文档 db.<CollectionName>.insert({BSONData})
向集合插入一个新文档 db.collection.insertOne({document},{writeConcern: <1/0>})
向集合插入一个多个文档 db.collection.insertMany([{document1}, {document2}, ...], {writeConcern: <0/1>, ordered: <boolean>})
更新文档 db.collection.update({query}, {update}, {upsert: <boolean>, multi: <boolean>, writeConcern: <0/1>})
删除文档 db.collection.remove({query}, {justOne: <boolean>, writeConcern: <document>})
查询文档 db.collection.find({query}, <projection>)
MongoDB 的💰关键字
等于 {<key>:<value>}
小于 {<key>:{$lt:<value>}} 小于或等于 {<key>:{$lte:<value>}}
大于 {<key>:{$gt:<value>}} 大于或等于 {<key>:{$gte:<value>}}
不等于 {<key>:{$ne:<value>}} 与 {<query1>,<query2>} 或 {$or:[{query1},{query2}]}
类型判断 {<key>:{$type:<type>}} 包含 {<key>:{$in:<str>}}
不包含 {<key>:{$nin:<str>}}
- document中的id键建议使用默认值,禁止向id保存自定义的值
- 推荐使用短字段名
- 使用索引(<5个)
- 创建复合索引时要注意最左前缀原则
- ...等等
-
netty
-
事件驱动
- 有一个事件队列;
- 鼠标按下时,往事件队列中增加一个点击事件;
- 有个事件泵,不断循环从队列取出事件,根据不同的事件,调用不同的函数;
- 事件一般都各自保存各自的处理方法的引用。这样,每个事件都能找到对应的处理方法;
-
底层架构
- 事件队列( event queue):接收事件的入口。
- 分发器( event mediator):将不同的事件分发到不同的业务逻辑单元。
- 事件通道( event channel):分发器与处理器之间的联系渠道。
- 事件处理器( event processor):实现业务逻辑,处理完成后会发出事件,触发下一步操作。
-
Netty框架包含如下的组件:
- ServerBootstrap :用于接受客户端的连接以及为已接受的连接创建子通道,一般用于服务端。
- Bootstrap :不接受新的连接,并且是在父通道类完成一些操作,一般用于客户端的。
- Channel :对网络套接字的I/O操作,例如读、写、连接、绑定等操作进行适配和封装的组件。
- EventLoop :处理所有注册其上的channel的I/O操作。通常情况一个EventLoop可为多个channel提供服务。
- EventLoopGroup :包含有多个EventLoop的实例,用来管理 event Loop 的组
件,可以理解为一个线程池,内部维护了一组线程。
- ChannelHandler 和ChannelPipeline:例如一个流水线车间,当组件从流水线
头部进入,穿越流水线,流水线上的工人按顺序对组件进行加工,到达流水线
尾部时商品组装完成。流水线相当于 ChannelPipeline ,流水线工人相当于
ChannelHandler ,源头的组件当做event。
- ChannelInitializer :用于对刚创建的channel进行初始化,将ChannelHandler
添加到channel的ChannelPipeline处理链路中。
- ChannelFuture :与jdk中线程的Future接口类似,即实现并行处理的效果。可
以在操作执行成功或失败时自动触发监听器中的事件处理方法。
-
服务端代码
public class NettyServer {
public static void main(String[] args) {
// 用于接受客户端的连接以及为已接受的连接创建子通道,一般用于服务端。
ServerBootstrap serverBootstrap = new ServerBootstrap();
// EventLoopGroup包含有多个EventLoop的实例,用来管理eventLoop的组件
// 接受新连接线程
NioEventLoopGroup boos = new NioEventLoopGroup();
// 读取数据的线程
NioEventLoopGroup worker = new NioEventLoopGroup();
// 服务端执行
serverBootstrap
.group(boos, worker)
// Channel对网络套接字的I/O操作,
// 例如读、写、连接、绑定等操作进行适配和封装的组件。
.channel(NioServerSocketChannel.class)
// ChannelInitializer用于对刚创建的channel进行初始化
// 将ChannelHandler添加到channel的ChannelPipeline处理链路中。
.childHandler(new ChannelInitializer<NioSocketChannel>() {
protected void initChannel(NioSocketChannel ch) {
// 组件从流水线头部进入,流水线上的工人按顺序对组件进行加工
// 流水线相当于ChannelPipeline
// 流水线工人相当于ChannelHandler
ch.pipeline().addLast(new StringDecoder());
ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
//这个工人有点麻烦,需要我们告诉他干啥事
@Override
protected void channelRead0(ChannelHandlerContext ctx, String msg) {
System.out.println(msg);
}
});
}
})
.bind(8000);
}
}
-
客户端代码
'''java
public class NettyClient {
public static void main(String[] args) throws InterruptedException {
// 不接受新的连接,并且是在父通道类完成一些操作,一般用于客户端的。
Bootstrap bootstrap = new Bootstrap();
// EventLoopGroup包含有多个EventLoop的实例,用来管理eventLoop的组件
NioEventLoopGroup group = new NioEventLoopGroup();
// 客户端执行
bootstrap.group(group)
// Channel对网络套接字的I/O操作,
// 例如读、写、连接、绑定等操作进行适配和封装的组件。
.channel(NioSocketChannel.class)
// 用于对刚创建的channel进行初始化,
// 将ChannelHandler添加到channel的ChannelPipeline处理链路中。
.handler(new ChannelInitializer<Channel>() {
@Override
protected void initChannel(Channel ch) {
// 组件从流水线头部进入,流水线上的工人按顺序对组件进行加工
// 流水线相当于ChannelPipeline
// 流水线工人相当于ChannelHandler
ch.pipeline().addLast(new StringEncoder());
}
});
//客户端连接服务端
Channel channel = bootstrap.connect("127.0.0.1",8000).channel();
while (true) {
// 客户端使用writeAndFlush方法向服务端发送数据,返回的是ChannelFuture
// 与jdk中线程的Future接口类似,即实现并行处理的效果
// 可以在操作执行成功或失败时自动触发监听器中的事件处理方法。
ChannelFuture future = channel.writeAndFlush("测试数据");
Thread.sleep(2000);
}
}
}
}
'''
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|