首页 文章 精选 留言 我的

精选列表

搜索[基础模型],共10000篇文章
优秀的个人博客,低调大师

Sqoop基础学习(1)

1. Sqoop的导入过程 在开始导入之前,Sqoop会通过JDBC来获得所需要的数据库元数据 1.导入表的列名、数据类型等; 2.接着这些数据库的数据类型(varchar、number等)会把映射成Java的数据类型(String、int等),根据这些信息,Sqoop会生成一个与表名同名的类用来完成反序列的工作,保持表中的每一行记录; 3.Sqoop启动MapReduce作业 4.启动的作业在input的过程中,会通过JDBC读取数据库表中的内容; 5.这是会使用Sqoop生成的类进行反序列话 6.最后再将这些记录写到HDFS中,在写入HDFS的过程中,同样会使用Sqoop生成的类进行序列化。 2. Sqoop的导出过程 1/2 Sqoop根据目标表的结构会生成一个Java类 3.该类作用为序列化和反序列化 4.接着启动一个MapReduce作业 5.在作业中会生成的Java类从HDFS中读取数据 6.并生成一批INSERT语句,每条语句都会向MySQL的目标表中插入多条记录

优秀的个人博客,低调大师

openstack之网络基础

L1:物理层L2:数据链路层,基于mac地址的通信,通过交换机连接;对等传输,即交换机上的一个主机发一个包,连接在该交换机上的所有机器都能收到;L3:网络层,基于ip地址,路由器设备,连接不同网段,进行路由选择; 交换机/路由器的区别:1、工作层级不同,交换机在L2,路由器在L3;2、数据转发依据对象不同:交换机传输基于mac地址的数据帧,路由器传输基于ip地址的ip数据包;3、解决问题不同:交换机使得同网段互通/路由器使得多网段互通; IP Tableip netns exec router-ns iptables -t nat -nL 混杂模块:1、接收所有经过设备(网卡)的数据包2、一般用于网络抓包;3、Floating IP功能实现查看网卡是否打开混杂模式;root@222-132-16-52:~# ifconfig br0br0 Link encap:Ethernet HWaddr c8:0a:a9:57:70:b0 inet addr:222.132.16.52 Bcast:222.132.16.255 Mask:255.255.255.0 inet6 addr: fe80::ca0a:a9ff:fe57:70b0/64 Scope:Link #UP BROADCAST RUNNING MULTICAST# MTU:1500 Metric:1 RX packets:32138224 errors:0 dropped:0 overruns:0 frame:0 TX packets:21550681 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:3797977700 (3.7 GB) TX bytes:4267007875 (4.2 GB)

优秀的个人博客,低调大师

服务端渲染基础

什么是渲染 一般而言大家提到“渲染”,可能会说:“凡是从服务器返回的 HTML 页面,均算作是服务端渲染。”这可能让不少人还是觉得迷惑,简单说渲染就是“数据”和“模板”拼接到一起。举个例子:我们前端开发最常见的一个场景,请求后端接口数据,然后将数据通过模板绑定语法绑定到页面中,最终呈现给用户。这个过程就是我们这里所指的渲染。 总结来说,渲染本质其实是字符串的解析替换,实现方式有很多种。但是我们这里要关注的并不是如何渲染,而是在哪里渲染的问题。 传统的服务端渲染 最早期,Web 页面渲染都是在服务端完成的,即服务端运行过程中将所需的数据结合页面模板渲染为 HTML 响应给客户端浏览器。所以浏览器呈现出来的是直接包含内容的页面。 这种方式对于没有玩过后端开发的同学来说可能会比较陌生,所以下面通过我们前端同学比较熟悉的 Node.js 来了解一下这种方式。 安装依赖: // 创建 http 服务 npm i express // 服务端模板引擎 npm i art-template express-art-template 服务端代码部分,我们可以在基本的 Web 服务,使用模板引擎,然后渲染一个页面,具体如下:' const express = require('express') const fs = require('fs') const template = require('art-template') const app = express() app.get('/', (req, res) => { // 1. 得到模板内容 const templateStr = fs.readFileSync('./index.html', 'utf-8') // 2. 得到数据 const data = JSON.parse(fs.readFileSync('./data.json', 'utf-8')) // 3. 渲染:数据 + 模板 = 完整结果 const html = template.render(templateStr, data) console.log(html) // 4. 把渲染结果发送给客户端 res.send(html) )} app.listen(3000, () => console.log('running...')) 客户端代码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Document</title> </head> <body> <h1>{{ message }}</h1> <ul> {{ each todos }} <li>{{ $value.title }}</li> {{ /each }} </ul> </body> </html> 这是最早的网页渲染方式,也是动态网站的核心工作步骤。 缺点: 前后端代码完全耦合在一起,不利于开发和维护; 前端没有足够的发挥空间; 服务端的压力较大; 用户体验一般; 但是不得不说,在网页应用并不复杂的情况下,这种方式也是可取的。 客户端渲染 传统的服务端渲染的有很多问题,而这些问题客户端 Ajax 技术可以有效解决。Ajax 技术使得客户端动态获取数据变为可能,也就是说原本服务端渲染这件事也可以拿到客户端做了。 下图是基于客户端渲染的 SPA 应用的基本工作流程: 我们以一个 Vue.js 创建的单页面应用为例,简单了解一下这种方式的渲染过程。 通过这个示例了解到我们可以把【数据处理】和【页面渲染】这两件事分开了。由后端负责处理数据接口,而前端只负责将接口数据渲染到页面中,这让前端不再受限于后端,更为独立。 缺点: 首屏渲染慢 不利于 SEO 现代化服务端渲染 现代化服务器端一般会选择同构渲染,也就是一份代码,在服务器端执行一次,用于实现服务器端渲染(首屏直出),然后在在客户端再执行一次,用于接管页面交互。简单来说,同构渲染就是“后端渲染”和“前端渲染”的结合,同构渲染同时拥有传统服务端渲染和客户端渲染的优点,可以有效解决 SEO 和首屏渲染慢的核心问题。 客户端发起请求 服务端渲染首屏内容 + 生成客户端 SPA 相关资源 服务端将生成的首屏资源发送给客户端 客户端直接展示服务端渲染好的首屏内容 首屏中的 SPA 相关资源执行之后会激活客户端 Vue 之后客户端所有的交互都由客户端 SPA 处理 如何使用同构渲染 如何使用同构渲染有两种方式,一种是官方解决方案,一种是使用第三方的方案。 使用 Vue、React 等框架的官方解决方案: 优点:有利于理解原理 缺点:需要搭建环境比较麻烦 使用第三方解决方案: React 生态中的 Next.js Vue 生态中的 Nuxt.js Angular 生态中的 Angular Universal 同构渲染应用的问题 同构渲染在应用上也存在以下问题: 开发条件有限 涉及构建设置和部署的要求更高 更多的服务端负载 以上就是我对于服务端渲染的一些浅谈,希望能够对大家有所帮助。 推荐阅读 CSS 盒子的边距塌陷 热门剧本杀与 SaaS 的不解之缘

优秀的个人博客,低调大师

网络编程基础知识

一、 cs架构和bs架构二、 互联网三、 osi七层 1.应用层 2.表示层 3.会话层 4.传输层 5.网络层 6.数据链路层 7.物理层 tcp/ip5层(5层名字记住:重点) -1.物理层 -网线,光纤 -2.数据链路层 -网卡 -3.网络层 -路由器 -4.传输层(运输层) -四层路由器 -5.应用层(会话层,表示层,应用层) -http协议,ftp协议,websocket协议... 3.1每一层的功能 1 物理层 -网线----》01010101电信号---》从网线中传输电信号 -8个比特位是一个字节 2 数据链路层 -数据帧:一组电信号是一个数据帧,有头和数据部分 -网卡---》mac地址---》全球唯一---》网卡出厂--》烧在了网卡上 -48位二进制---》看到的都是16进制表示 -广播: -局域网内通信,所有人都会接受到,通过mac地址确定给谁的数据报,如果不是自己的就不处理 -广播风暴 3 网络层 -跨局域网通信,需要经过网络层 -IP地址:0.0.0.0-255.255.255.255 -子网掩码: -192.168.1.1 255.255.255.0 -192.168.2.1 255.255.255.0 -ARP:ip和mac的对照表 4 传输层: -端口:0--65535,一个应用程序可以监听多个端口,但是一个端口只能属于一个应用程序 -TCP协议:可靠传输(可靠传输如何保证?三次握手,四次挥手) -UDP协议:不可靠传输 5 应用层 -htpp,ftp,websocket.... 3.2传输层常用接口 应用程序 FTP TFTP TELNET SMTP DNS HTTP SSH MYSQL 熟知端口 21,20 69 23 25 53 80 22 3306 传输层协议 TCP UDP TCP TCP UDP TCP TCP TCP DNS:把网址转换成ip地址 从浏览器发送出去的数据,都是http协议,默认是80端口 3.3传输层TCP的三次握手和四次挥手 1 tcp可靠传输:三次握手,四次挥手保证数据可靠 2 三次握手 -客户端向服务端发送链接请求 1 -服务端回复可以建立,并且带着跟客户端建立链接的数据报 2 -客户端收到后,链接建好了 3 3 这个过程后就可以可靠传输数据 4 断开链接(4四挥手) -客户端告诉服务端,要断开 1 -服务端收到,回复ok 2 -服务端可能还有数据在传递,暂时还没断开---等数据传完 -服务端告诉客户端,我要断了 3 -客户端收到,回复ok 4 四、Socket层 1 Socket抽象层,从osi七层抽象出来的,抽象了网络层和传输层,跟语言无关 2 专门给开发人员用的 五、基于Tcp的socket套接字(重点)服务端 #导入socket模块 import socket import time #第一个socket是模块名,第二个socket是类名 #类实例化得到对象,得到一个socket对象 #server=socket.socket(family=socket.AF_INET,type=socket.SOCK_STREAM) #不写默认就是他 server=socket.socket() #绑定地址跟端口 ,传一个元组,监听的地址,监听的端口 server.bind(('192.168.11.28',8008)) #监听 #半连接池是5,可以缓冲5个 server.listen(5) #等待用户连接(看源码,有两个返回结果) #sock是连接对象,以后这个服务端和客户端交互,使用这个对象交互 #addr是客户端地址(ip和端口) sock,addr=server.accept() #接收客户端发给我的消息 data=sock.recv(1024) #打印 print(data) #服务端给客户端发送消息(必须是byte格式) sock.send(b'helloworld') time.sleep(1) #关闭连接对象 sock.close() #关闭服务 server.close() 客户端 import socket #创建socket对象 client=socket.socket() #连接服务端 client.connect(('127.0.0.1',8008)) #给服务端发了一个sb client.send(b'sb') #收到了服务端给我的 data=client.recv(1024) print(data) #关闭 client.close()

优秀的个人博客,低调大师

最全 MongoDB 基础教程

MongoDB 创建数据库 - 格式:use DATABASE_NAME - use ruochen - db 创建数据库需要插入一条数据才会在列表中显示 - db.ruochen.insert({'name': '若尘'}) - show dbs 删除数据库 格式:db.dropDatabase() use ruochen db.dropDatabase() show dbs 创建集合 - 格式:db.createCollection(name, options) - name: 要创建的集合名称 - options: 可选参数,指定有关内存大小及索引的选项 字段 类型 描述 capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。当该值为 true 时,必须指定 size 参数。 autoIndexId 布尔 (可选)如为 true,自动在 _id 字段创建索引。默认为 false。 size 数值 (可选)为固定集合指定一个最大值,以千字节计(KB)。如果 capped 为 true,也需要指定该字段。 max 数值 (可选)指定固定集合中包含文档的最大数量。 在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段 实例 # 在test数据库中创建ruochen 集合 use test db.createCollection('ruochen') # 查看已有集合 show collections db.createCollection('test', {capped: true, autoIndexId: true, size: 1024000, max: 10000}) # autoIndexId 已弃用,默认_id添加索引 # 插入文档时,MongoDB会自动创建集合 db.ruochen.insert({'name': 'ruochen'}) 删除集合 格式:db.collection.drop() use ruochen db.createCollection('ruochen') # 创建集合 show tables db.ruochen.drop() show tables 插入文档 格式:db.COLLECTION_NAME.insert(document) 方法1 db.ruochen.insert({title: 'MongoDB 教程', description: 'shu ju ku', by: 'ruochen', tags: ['mongodb', 'database', 'NoSQL'] }) db.ruochen.find() 方法2 document=({title: 'mongodb', description: 'shu ju ku', by: 'ruochen', tags: ['mongodb', 'database', 'NoSQL'] }) db.ruochen.insert(document) db.ruochen.find() db.collection.insertOne() # 向指定集合中插入一条文档数据 db.collection.insertMany() # 向指定集合中插入多条文档数据 var document = db.ruochen.insertOne({"e": 3}) document var res = db.ruochen.insertMany([{'a': 1}, {'b': 2}]) res 一次插入多条数据 先创建数组 将数据放在数据中 一次insert到集合中 案例 var arr = []; for(var i = 1; i < 5; i++){ arr.push({num:i});} db.num.insert(arr); 更新文档 格式 db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <ducument> } ) query: update的查询条件,类似sql update查询内where后面的 update: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的 upsert: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入 multi: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新 writeConcern: 可选,抛出异常的级别 案例 db.ruochen.insert({ title: 'mongodb', description: 'Nosql 数据库', by: 'ruochen', tags: ['mongodb', 'databases', 'NoSQL'] }) db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}) # 只会修改第一条发现的文档 db.ruochen.find().pretty() db.ruochen.update({'title': 'mongodb'}, {$set:{'title': 'MongoDB'}}, {multi:true}) # 修改多条相同的文档 save() 方法: 通过传入的文档来替换已有文档 格式 db.collection.save( <document>, { writeConcern: <document> } ) document: 文档数据 writeConcern: 可选,抛出异常的级别 案例 db.ruochen.save({ "_id" : ObjectId("5e631a14c17b253e9cef40cc"), "title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" : "http://www.runoob.com", "tags" : [ "mongodb", ] }) db.ruochen.find().pretty() 删除文档 语法: db.collection.remove( <query>, <justOne> ) 2.6版本以后语法格式 db.collection.remove( <query> { justOne: <boolean>, writeConcern: <document> } ) 参数说明 query: (可选) 删除的文档的条件 justOne: (可选) 如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档 writeConcern: (可选) 抛出异常的级别 db.ruochen.remove({'title': 'mongodb'}) # 只删除第一条找到的记录 db.COLLECTION_NAME.remove(DELETION_CRITHRIA, 1) # 删除所有数据 db.ruochen.remove({}) db.ruochen.find() # remove() 方法 并不会真正释放空间 # 需要执行db.repairDatabase() 来回收磁盘空间 db.repairDatabase() db.runCommand({repairDatabase: 1}) remove方法已经过时 # 删除集合下所有文档 db.ruochen.deleteMany({}) # 删除 num 等于1 的全部文档 db.ruochen.deleteMany({num: '1'}) # 删除 num 等于1 的一个文档 db.ruochen.deleteOne({num: '1'}) 查询文档 语法: db.collection.find(query, projection) 参数说明 query: 可选,使用查询操作符指定查询条件 projection: 可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略) # 以易读的方式读取数据 db.ruochen.find().pretty() 操作 格式 范例 RDBMS中的类似语句 等于 {key:value} db.ruochen.find({'by':'ruochen'}).pretty() where by = 'ruochen' 小于 {key:{$lt: value}} db.ruochen.find({'likes': {$lt:3}}).pretty() where likes < 3 小于或等于 {key:{$lte: value}} db.ruochen.find({'likes': {$lte:2}}).pretty() where likes <= 2 大于 {key:{$gt: value}} db.ruochen.find({'likes': {$gt:100}}).pretty() where likes > 100 大于等于 {key:{$gte: value}} db.ruochen.find({'likes': {$gte:200}}).pretty() where likes >= 200 不等于 {key:{$ne: value}} db.ruochen.find({'likes': {$ne:200}}).pretty() where likes != 200 AND条件 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件 格式: db.ruochen.find({key1: value1, key2: value2}).pretty() 案例 db.ruochen.find({'by': 'ruochen', 'likes': 200}).pretty() 类似于 where by='ruochen' and likes=200 or条件 格式 db.ruochen.find( { $or:[ {key1: value1}, {key2: value2} ] } ).pretty() 案例 db.ruochen.find({$or:[{'likes': 2}, {'likes':200}]}).pretty() AND和OR联合 db.ruochen.find({'likes': {$gt:100}, $or: [{'likes': 2}, {'likes': 200}]}).pretty() 条件操作符 db.ruochen.insert({ title: 'python', description: 'i love python', by: 'ruochen', url: 'xxx', tags: ['python'], likes: 200 }) db.ruochen.insert({ title: 'php', description: 'php是世界上最好的语言', by: 'ruochen', url: 'xxx', tags: ['php'], likes: 150 }) db.ruochen.insert({ title: 'MondoDB', description: 'NoSQL数据库', by: 'ruochen', url: 'xxx', tags: ['mongodb'], likes: 100 }) # 获取 'ruochen' 集合中 'likes' 大于100的数据 db.ruochen.find({likes: {$gt: 100}}).pretty() # 类似于SQL语句 Select * from ruochen where likes > 100; 获取 'ruochen' 集合中 'likes' 大于等于100的数据 db.ruochen.find({likes: {$gte: 100}}).pretty() # 类似于SQL语句 Select * from ruochen where likes >= 100; # 获取 'ruochen' 集合中 'likes' 小于150的数据 db.ruochen.find({likes: {$lt: 150}}).pretty() # 类似于SQL语句 Select * from ruochen where likes < 150; # 获取 'ruochen' 集合中 'likes' 小于等于150的数据 db.ruochen.find({likes: {$lte: 150}}).pretty() # 类似于SQL语句 Select * from ruochen where likes <= 150; MongoDB 使用 (<) 和 (>) 查询 - $lt 和 $gt 获取"ruochen"集合中 "likes" 大于100,小于 200 的数据 db.ruochen.find({likes: {$lt: 200, $gt: 100}}).pretty() 类似SQL语句 Select * from ruochen where likes > 100 and likes < 200; 模糊查询 查询title中包含 'py' 的文档 db.ruochen.find({title:/py/}).pretty() 查询title字段以 'p' 开头的文档 db.ruochen.find({title:/^p/}).pretty() 查询title 字段以 'p' 结尾的文档 db.ruochen.find({title:/p$/}).pretty() MongoDB $type 操作符 $type操作符是基于BSON类型来检索集合中匹配的数据类型,并返回结果 类型 数字 备注 Double 1 String 2 Object 3 Array 4 Binary data 5 Undedined 6 已废弃 Object id 7 Boolean 8 Date 9 Null 10 Regular Experssion 11 JavaScript 13 Symbol 14 JavaScript(with scope) 15 32-bit integer 16 Timestamp 17 64-bit integer 18 Min key 255 Query with -1 Max key 127 获取 "ruochen" 集合中 title 为 String 的数据 db.ruochen.find({'title': {$type: 2}}).pretty() db.ruochen.find({'title': {$type: String}}).pretty() Limit与Skip方法 Limit() 方法 在MongoDB中读取指定数量的数据记录, 使用MongoDB的Limit方法 limit()方法接受一个数字参数,该参数指定从MongoDB中读取的记录条数 语法 db.COLLECTION_NAME.find().limit(NUMBER) 案例 db.ruochen.find().limit(2) Skip() 方法 skip()方法跳过指定数量的数据 skip方法接受一个数字参数作为跳过的记录条数 语法 db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER) 案例 db.ruochen.find().limit(1).skip(1) skip() 方法默认参数为0 MongoDB 排序 sort() 方法 sort() 方法可以通过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列 语法 db.COLLECTION_NAME.find().sort({key: 1}) 案例 ruochen 集合中的数据按字段 likes 的降序排列 db.ruochen.find().sort({'likes': -1}).pretty() skip(), limilt(), sort()三个放在一起执行的时候,执行的顺序是先 sort(), 然后是 skip(),最后是显示的 limit()。 MongoDB 索引 creatIndex() 方法 MongoDB使用 createIndex() 方法来创建索引 语法 db.collection.createIndex(keys, options) Key 值为你要创建的索引字段, 1 为指定按升序创建索引, -1 为降序创建索引 案例 db.ruochen.createIndex({'title': 1}) db.ruochen.createIndex({'title': 1, 'description': -1}) # 设置多个字段创建索引 createIndex() 接收可选参数,可选参数列表如下 Parameter Type Description background Boolean 建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false unique Boolean 建立的索引是否唯一。指定为true创建唯一索引。默认值为false name string 索引的名称。如果未指定,MongoDB的通过连接索引的字段名和排序顺序生成一个索引名称 dropDups Boolean 3.0+版本已废弃。在建立唯一索引时是否删除重复记录,指定 true 创建唯一索引。默认值为 false sparse Boolean 对文档中不存在的字段数据不启用索引;这个参数需要特别注意,如果设置为true的话,在索引字段中不会查询出不包含对应字段的文档.。默认值为 false expireAfterSeconds integer 指定一个以秒为单位的数值,完成 TTL设定,设定集合的生存时间 v index version 索引的版本号。默认的索引版本取决于mongod创建索引时运行的版本 weights document 索引权重值,数值在 1 到 99,999 之间,表示该索引相对于其他索引字段的得分权重 default_language string 对于文本索引,该参数决定了停用词及词干和词器的规则的列表。 默认为英语 language_override string 对于文本索引,该参数指定了包含在文档中的字段名,语言覆盖默认的language,默认值为 language MongoDB聚合 MongoDB聚合(aggregate)主要用于处理数据(诸如统级平均值、求和等), 并返回计算后的数据结果。有点类似sql语句中的count(*) aggregate() 方法 语法 db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION) 实例 db.ruochen.aggregate([{$group: {_id: "$by", num_tutorial: {$sum: 1}}}]) 类似于mql语句 select by, count(*) from ruochen group by by 聚合表达式 表达式 描述 实例 $sum 计算总和 db.ruochen.aggregate([{$group: {_id: "$by", num_tutorial: {$sum: "$likes"}}}]) $avg 平均值 db.ruochen.aggregate([{$group: {_id: "$by", avg: {$avg: "$likes"}}}]) $min 获取集合中所有文档对应值的最小值 db.ruochen.aggregate([{$group: {_id: "$by", min: {$min: "$likes"}}}]) $max 获取集合中所有文档对应值的最大值 db.ruochen.aggregate([{$group: {_id: "$by", min: {$max: "$likes"}}}]) $push 在结果文档中插入值到一个数组中 db.ruochen.aggregate([{$group: {_id: "$by", url: {$push: "$url"}}}]) $addToSet 在结果文档中插入值到一个数组中,但不创建副本 db.ruochen.aggregate([{$group: {_id: "$by", url: {$addToSet: "$url"}}}]) $first 根据资源文档的排序获取第一个文档数据 db.ruochen.aggregate([{$group: {_id: "$by", url: {$first: "$url"}}}]) $last 根据资源文档的排序获取最后一个文档数据 db.ruochen.aggregate([{$group: {_id: "$by", url: {$last: "$url"}}}]) 管道 管道在Unix和Linux中一般用于将当前命令的输出结果作为下一个命令的参数 MongoDB的聚合管道将MongoDB文档在一个管道处理完毕后将结果传递给下一个管道处理 管道操作是可以重复的 表达式:处理文档并输出 表达式是无状态的,只能用于计算当前聚合管道的文档,不能处理其它的文档 常用操作 $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档 $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作 $limit:用来限制MongoDB聚合管道返回的文档数 $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档 $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值 $group:将集合中的文档分组,可用于统计结果 $sort:将输入文档排序后输出 $geoNear:输出接近某一地理位置的有序文档 举例 $project db.ruochen.aggregate( { $project: { title: 1, by: 1, }} ); 只剩_id, title 和 by 三个字段,默认_id 字段被包含 db.ruochen.aggregate( { $project: { _id: 0 title: 2, by: 1, }} ); 如此即可不包含_id, 非0可表示显示字段,负数也可以表示显示该字段 $match 获取分数大于70或小于等于90的记录,然后把符合条件的记录送到下一阶段$group 管道操作符进行处理 db.ruochen.aggregate([ {$match: {score: {$gt: 70, $lte: 90}}}, {$group: {_id: null, count: {$sum: 1}}} ]) 当 match 条件和 group 同时存在时,顺序会影响检索结果,必须先写 match 在前面 $skip 过滤前5个文档 db.ruochen.aggregate( {$skip: 5});

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册