吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 1492|回复: 21
收起左侧

[学习记录] MongoDB入门

[复制链接]
ouyang9r 发表于 2022-3-14 22:01

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:&lt;value&gt;}} 小于或等于   {&lt;key&gt;:{$lte:<value>}}
    大于  {<key>:{$gt:&lt;value&gt;}} 大于或等于   {&lt;key&gt;:{$gte:<value>}}
    不等于 {<key>:{$ne:&lt;value&gt;}} 与   {&lt;query1&gt;,&lt;query2&gt;} 或   {$or:[{query1},{query2}]}
    类型判断    {<key>:{$type:&lt;type&gt;}} 包含  {&lt;key&gt;:{$in:<str>}}
    不包含 {<key>:{$nin:<str>}}

    • MongoDB优化
    1. document中的id键建议使用默认值,禁止向id保存自定义的值
    2. 推荐使用短字段名
    3. 使用索引(<5个)
    4. 创建复合索引时要注意最左前缀原则
    5. ...等等
    • netty

    • 事件驱动

      1. 有一个事件队列;
      2. 鼠标按下时,往事件队列中增加一个点击事件;
      3. 有个事件泵,不断循环从队列取出事件,根据不同的事件,调用不同的函数;
      4. 事件一般都各自保存各自的处理方法的引用。这样,每个事件都能找到对应的处理方法;
    • 底层架构

      1. 事件队列( event queue):接收事件的入口。
      2. 分发器( event mediator):将不同的事件分发到不同的业务逻辑单元。
      3. 事件通道( event channel):分发器与处理器之间的联系渠道。
    1. 事件处理器( 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);
                              }
                      }
              }
      }
      '''

免费评分

参与人数 6吾爱币 +2 热心值 +4 收起 理由
Xiaojiuwo121 + 1 谢谢@Thanks!
yoyo56183 + 1 谢谢@Thanks!
Jackrose + 1 我很赞同!
憨憨张 + 1 谢谢分享
luozhijun + 1 我很赞同!
Coolapk1998 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

luozhijun 发表于 2022-3-14 22:11
谢谢分享,可以补充下具体应用
13729181580 发表于 2022-3-14 22:32
Jackrose 发表于 2022-3-14 22:34
 楼主| ouyang9r 发表于 2022-3-14 22:34
这实际上是我上课看视频时做的笔记
yoyo56183 发表于 2022-3-14 22:34
谢谢分享,之前就看过相关代码,现在学习了
Tj525 发表于 2022-3-14 22:34
先存起来
2818441996 发表于 2022-3-14 22:42
感谢分享
seawaycao 发表于 2022-3-14 22:43
感谢楼主分享,辛苦了!
Rt1Text 发表于 2022-3-14 22:55
师傅分享的好详细,又学到了新的知识,感谢感谢师傅
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 16:42

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表