当前位置: 首页 > wzjs >正文

商城网站建设功能点价格毕节做网站优化

商城网站建设功能点价格,毕节做网站优化,网页设计师通常是设计两套ui吗,页面设计时最好只使用一种颜色在数据库的查询中,是一定会遇到表关联查询的。当两张大表关联时,时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。 假设工作环境中有两张MongoDB集合:SC_DATA(学生基本信息集合&…

在数据库的查询中,是一定会遇到表关联查询的。当两张大表关联时,时常会遇到性能和资源问题。这篇文章就是用一个例子来分享MongoDB带条件的关联查询发挥的作用。

假设工作环境中有两张MongoDB集合:SC_DATA(学生基本信息集合)、DICT_DATA(值域字典集合),集合结构如下:

SC_DATA
uniqueid学生唯一号
sfzid        学生身份证
xsxm学生姓名
mz民族
xb性别
DICT_DATA
clss字典类别
value        字典值域
map字典值域映射值
version字典版本

 现在分别给这两张表插入一些测试数据,给SC_DATA插入10条数据,给DICT_DATA插入6条数据

db.SC_DATA.insertMany([{ "uniqueid" : "10001", "sfzid" : "3715xxxx0813", "xsxm" :"张一","mz":"1","xb":"1" },{ "uniqueid" : "10002", "sfzid" : "3715xxxx0814", "xsxm" :"张二","mz":"1","xb":"1" },{ "uniqueid" : "10003", "sfzid" : "3715xxxx0815", "xsxm" :"张三","mz":"1","xb":"1" },{ "uniqueid" : "10004", "sfzid" : "3715xxxx0816", "xsxm" :"张四","mz":"1","xb":"b" },{ "uniqueid" : "10005", "sfzid" : "3715xxxx0817", "xsxm" :"张五","mz":"a","xb":"1" },{ "uniqueid" : "10006", "sfzid" : "3715xxxx0819", "xsxm" :"张六","mz":"1","xb":"b" },{ "uniqueid" : "10007", "sfzid" : "3715xxxx0823", "xsxm" :"张七","mz":"1","xb":"1" },{ "uniqueid" : "10008", "sfzid" : "3715xxxx0833", "xsxm" :"张八","mz":"1","xb":"1" },{ "uniqueid" : "10009", "sfzid" : "3715xxxx0843", "xsxm" :"张九","mz":"1","xb":"1" },{ "uniqueid" : "100010", "sfzid" : "3715xxxx0853", "xsxm" :"张十","mz":"1","xb":"1" },
])
db.DICT_DATA.insertMany([{ "clss" : "民族", "value" : "汉族", "map" :"1","version":"v1.0"},{ "clss" : "民族", "value" : "壮族", "map" :"2","version":"v1.0"},{ "clss" : "民族", "value" : "满族", "map" :"3","version":"v1.0"},{ "clss" : "民族", "value" : "回族", "map" :"4","version":"v1.0"},{ "clss" : "性别", "value" : "男",   "map" :"1","version":"v1.0"},{ "clss" : "性别", "value" : "女",   "map" :"2","version":"v1.0"}])

此时,有个需求是 “统计出SC_DATA集合中民族、性别字段在字典值域内的数据”!

         一般呢,思路是利用两集合关联,过滤出能关联上的数据。MongoDB的$lookup操作符类似于关系数据库的左连接,根据当前实际情况,用大表(SC_DATA.mz、SC_DATA.xb)左连接小表(DICT_DATA.map),能关联上的数据就是SC_DATA集合中民族、性别字段在字典值域内的数据!

        一般呢,就直接用了$lookup进行关联了,但是,观察下DICT_DATA字典数据,承担关联任务的字段——map,有多个相同值,必须加上clss条件过滤才能得出准确数据,代码如下。

db.SC_DATA.aggregate([{$lookup: {from: "DICT_DATA",localField: "mz",foreignField: "map",as: "DICT_DATA"}},{$unwind: {path: "$DICT_DATA",preserveNullAndEmptyArrays: true}},{$match: {"DICT_DATA.clss": "民族"}},{$group: {_id: null,count: {$sum: 1}}}])

        但是,诸位请看,上面的代码是先关联,再过滤。通过compass工具分阶段查看,可以更清晰的看到关联后,因为DICT_DATA.map存在重复值,所以如果SC_DATA能和DICT_DATA关联上的话,数据会翻倍。

        对于我们上面的测试数据,SC_DATA有10条测试数据,和DICT_DATA关联后数据量是19条,过滤clss后是9条。大家可能觉得这种还好,但是如果SC_DATA有上千万条数据,DICT_DATA的数据更多,重复值更多,这样关联出来的数据是非常惊人的,效率也会变得奇慢无比,甚至会造成数据库卡死。

        如果能够在关联出结果前,就进行过滤,就会让更少量的数据进入到下一个MongoDB聚合管道,就会消耗更少量的资源。

这里也就引出了这篇文章的主角:带条件的$lookup,语法格式如下:

{$lookup:{from: <joined collection>,let: { <var_1>: <expression>, …, <var_n>: <expression> },pipeline: [ <pipeline to run on joined collection> ],as: <output array field>}
}

参数说明如下:

参数

说明

from

指定待执行连接操作的集合,是当前集合【可以看下面的例子理解】

let

指定各个管道阶段使用的变量,这里的变量可以放到pipeline中使用;

这里指定的都是自身当前集合中的字段变量;

这里指定变量的时候以 col_name:$col_name的形式,在pipeline中使用的时候以 $$col_name形式 使用;

pipeline

1、pipeline中,可以使用let中指定的变量,也可以使用当前集合中的字段;

2、pipeline中,$match阶段需要使用$expr操作符来访问变量,$expr允许在$match中使用聚合表达式;

3、pipeline中,放置在$expr上的$eq、$lt、$lte、$gt、$gte比较操作符,可以使用$lookup阶段引用的 from集合上的索引;

3.1、使用索引的限制一:不使用多键索引;

3.2、使用索引的限制二:当操作的数量比较大,或者操作数据类型没有定义时,不使用索引;

3.3、使用索引的限制三:索引只能用于字段和常量之间的比较,变量和变量之间的比较不能使用索引;

4、pipeline中,非$match阶段,不需要使用$expr操作符来访问变量

as

指定要添加到已连接文档的新数量字段的名称。新的大量字段包含来自加入的收集的匹配文档。如果指定的名称已存在于所连接的文档中,则现有字段将被覆盖。

        针对  “统计出SC_DATA集合中民族、性别字段在字典值域内的数据”!这个需求,我们就可以将其写为如下代码!

db.SC_DATA.aggregate([{$lookup: {from: "DICT_DATA",let: {mz: "$mz"},pipeline: [{$match: {$expr: {$and: [{$eq: ["$map", "$$mz"]},{$eq: ["$clss", "民族"]}]}}}],as: "DICT_DATA"}},{$unwind: {path: "$DICT_DATA",preserveNullAndEmptyArrays: true}},{$match: {"DICT_DATA.map": {$ne: null}}},{$group: {_id: null,count: {$sum: 1}}}])

        从compass工具中,可以更清晰的看到数据量变化。此时,因为在输出关联数据前,先进行了过滤。这种写法可以消耗更少的数据库及系统资源,但在索引使用上和正常关联略有区别需要注意。


文章转载自:

http://y1nijSZh.pskjm.cn
http://an8eyROn.pskjm.cn
http://WAMWMgc0.pskjm.cn
http://lrwl7ksg.pskjm.cn
http://fymMI153.pskjm.cn
http://Jhu4Ytgw.pskjm.cn
http://neNTqOou.pskjm.cn
http://fdzaUBXw.pskjm.cn
http://PumhQLM4.pskjm.cn
http://KkqqocAl.pskjm.cn
http://Itju172U.pskjm.cn
http://jHSgDCCx.pskjm.cn
http://XIXjIg6N.pskjm.cn
http://8bQM3G8G.pskjm.cn
http://U07ue3bD.pskjm.cn
http://QL0sEYxR.pskjm.cn
http://LdYEt9vE.pskjm.cn
http://26kUMc15.pskjm.cn
http://YHfK5zUR.pskjm.cn
http://yhfieXdt.pskjm.cn
http://o6ZKvSaD.pskjm.cn
http://rrYcj9kB.pskjm.cn
http://rxMajyHf.pskjm.cn
http://36WsJmWo.pskjm.cn
http://cAs5wIe2.pskjm.cn
http://u4j15ItF.pskjm.cn
http://NltdUE0u.pskjm.cn
http://05P0YXZT.pskjm.cn
http://IN3cpEPp.pskjm.cn
http://6FUW04t0.pskjm.cn
http://www.dtcms.com/wzjs/701732.html

相关文章:

  • 河南建设银行招聘网站网站规划设计的一般流程
  • 湖北专业网站建设市面价房地产信息网查询系统
  • 上海免费网站建设wordpress添加分类文档
  • 本溪市网站建设做网络销售怎么建立网站
  • 宁波建设网图网站建设和网络优化请示
  • 网站栏目页模板seo网站管理
  • 安徽网站建设认准-晨飞网络好用的网站系统
  • 做网站谈单账号注册网站
  • 苏州建设职业培训中心网站深圳市南山区粤海街道
  • 网站中搜索栏怎么做的静态网站用什么做最快
  • 上海市建设工程信息报送网站一点号自媒体平台
  • 英文网站制作手机网站注册
  • 免费的网站托管室内环保网站模板代码
  • 泰州网站整站优化wordpress网页图片加载
  • 铜仁市住房和城乡建设局网站重庆市住房和城乡建设信息网官网
  • 网站模板的制作怎么做的网站后台管理系统模块
  • 流行的网站开发技术娱乐网wordpress主题
  • 网站规划建设方案农业绿化风格wordpress内存占用优化
  • 网站怎么制作桐庐做网站
  • 名城苏州网站店铺logo设计免费在线生成
  • 网站 水印雄安网站制作多少钱
  • 国外酷炫网站兰州seo技术优化排名公司
  • 网站做数据统计网页设计师培训招聘
  • 红酒集团网站建设公司做网站让拍照备案
  • 大岭山镇网站建设公司dw制作网页版面教程视频
  • 网站开发公司取名wordpress提示框美化
  • 提升网站知名度新八建设集团有限公司网站
  • 网站建设制度都有哪些网页设计师学习网站
  • 建设学校网站学校网站网页制作
  • 炫酷网站欣赏京东网上商城书店官网