位置: 编程技术 - 正文

MongoDB中如何使用JOIN操作详解(mongodb $sum)

编辑:rootadmin

推荐整理分享MongoDB中如何使用JOIN操作详解(mongodb $sum),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:mongodb 语句,mongodb 语句,mongodb怎么用,mongodb cond,mongodb使用命令,mongodb cond,mongodb cond,mongodb怎么用,内容如对您有帮助,希望把文章链接给更多的朋友!

前言

MongoDB是由C++语言所编写的一种面向文档的非关系型数据库(是一种NoSql数据库实现),也是介于关系型数据库和非关系型数据库之间的数据存储产品,而众所周知SQL与NoSQL最大的不同之一就是不支持JOIN,在传统的数据库中,SQL JOIN子句允许你使用普通的字段,在两个或者是更多表中的组合表中的每行数据。例如,如果你有表books和publishers,你可以像下面这样写命令:

换句话说,book表中的publisher_id字段引用了publishers表中的id字典。这些都是很常见的例子:对于每个publisher都可以拥有成千上万本书,如果你想更新publisher的信息的时候,我们只需要更改一条记录。数据的冗余是很小的,因为我们不需要为每本书来重复更新他的publisher信息,这种技术已基本当做一种规范化的东西了。SQL数据库提供了一些列的规范与约束条件来保障数据关联性。

--------------------------------------------------------------------------------

NoSQL == No JOIN&#;

并不都是这样吧。。。。。

--------------------------------------------------------------------------------

面向文档的数据库,例如MongoDB,被设计用来存储非结构化的数据,理想情况下,这些数据是在数据集合中是相互没有关联的,如果一条数据包含两次或者更多次,那数据就重复了。因为大部分情况下我们还是需要数据关联的,只有很少的情况下才会不需要关联数据,看来NoSQL这些特性看来让人失望啊。幸运的是MongoDB 3.2 介绍了一个新的$lookup操作,这个操作可以提供一个类似于LEFT OUTER JOIN的操作在两个或者是更多的条件下。

--------------------------------------------------------------------------------

MongoDB Aggregation

$lookup仅仅在 aggregation操作中才被允许使用,想想他作为一个管道操作:查询,过滤,组合结果。一个操作的输出被作为下一个的输入。Aggregation比简单的查询操作更难于理解,而且这些操作通常运行很慢,然而他们很高效,Aggregation可以使用一个很好的例子来解释,假设我们使用user数据集合来创建一个社交平台,在每个独立的文档中存储没个用户的信息,例如:

我们可以向user这个集合中添加足够多的用户,但是每个MongoDB文档都必须有一个为一个_id字段值,这个_id字段值就像SQL中的键,在我们没有明确指定_id的时候会被自动的加入到文档中。我们的社交网站现在需要一个post集合,这个结合存储用户的评论,这个文档存储纯文本,时间,评分,一个被写到user_id字段的玩家引用。

我们现在想要显示最近具有important评论的二十条数据,这些数据来自所有的用户,并且是按照时间排序的。每一个返回的文档中应该包含评论的文本,发布评论的时间,以及相关的用户的名字和国家。

MongoDB数据库的aggregate查询是通过传递管道操作的数组,这个数组中顺序的定了每个操作。首先,我们需要从所有的post集合中提取出所有的文档,这些文档使用$match记性准确rating过滤。

我们现在需要对过滤出来的文档按照时间,使用$sort操作进行排序。

MongoDB中如何使用JOIN操作详解(mongodb $sum)

因为我们要仅仅返回二十条数据,我们可以使用$limit来限制我们需要处理的文档数量。

我们现在使用$lookup操作从user集合中连接数据,这个操作需要一个四个参数的对象:

1、localField:在输入文档中的查找字段

2、from:需要连接的集合

3、foreignField:需要在from集合中查找的字段

4、as:输出的字段名字

所以我们的操作是这样的:

在我们的输出中将会创建一个名为userinfo的新字段,他是一个数组,其中每个元素都是在user集合中匹配的元素。

在post.user_id与user._id之间,我们具有一对一的关系,因为对于每一个post只有一个用户。因此我们的userinfo数组将会仅仅包含一个元素,我们可以说使用 $unwind操作来解构他并插入到一个自文档中。

现在的输出将会转化成更加常用的结构:

最终我们可以在管道中使用 $project操作返回评论信息,评论的时间,评论的用户名,国家等。

合并上面所有的操作

我们最终的聚合查询匹配的评论,按照顺序排序,限制最新的二十条信息,连接用户的数据,扁平用户数组,最后只返回我们需要的必须数据,总的命令如下:

结果是一个拥有二十个文档的集合,例如:

MongoDB的$lookup很好用而且很高效,但是上面这个基础的例子只是一个组合的集合查询。他不是一个对SQL中的更加高效的JOIN子句的替代。而且MongoDB也提供了一些限制,如果user集合被删除了,post文档还是会保留。

理想情况下,这个$lookup操作应该不会经常使用,如果你需要经常使用它,那么你就使用了错误的数据存储了(数据库):如果你有相关联的数据,应该使用关联数据库(SQL)。

也就是说$lookup是一个MongoDB 3.2新加入的,他解决了当在Nosql数据库中使用一些小的相关联的数据查询的时候一些令人失望的问题。

总结

标签: mongodb $sum

本文链接地址:https://www.jiuchutong.com/biancheng/312651.html 转载请保留说明!

上一篇:深入了解MongoDB是如何存储数据的(深入了解工作优势怎么回答)

下一篇:基于MongoDB数据库的数据类型和$type操作符详解(mongodb基础)

  • 广告牌制作加盟厂家
  • 税务局代个人开票
  • 税控盘技术维护费申报时候怎么填报
  • 发票认证当月必须抵扣吗
  • 已付的账款叫什么
  • 外包人员的工资是费用吗
  • 分公司亏损是否也分摊所得税
  • 申请增值税专用发票需要什么资料
  • 金蝶怎么填写凭证
  • 材料已入库,发票账单未到的会计分录
  • 公司投资控股其他公司如何做账务处理
  • 去年税收滞纳金计入什么科目
  • 本月进项大于销项怎么做会计分录
  • 子公司注销欠母公司借款怎么办
  • 专用发票的税票号码看哪里?
  • 2018手写发票何时失效?
  • 企业出售已使用过的固定资产税率
  • 公园门票可以开发票吗
  • 房租发票税金谁承担
  • 进料加工分配率是什么意思
  • 增值税账面和实际缴纳不平,怎样调整
  • 固定资产怎么录入系统
  • 文件类型错误请重新选择
  • mac 的系统
  • 暂估成本能挂账多久
  • 在建工程完工后转入哪里
  • linux如何放大字体
  • 作为一名程序员应该掌握哪些语言
  • php内容修改
  • 房屋租赁经营要交哪些税
  • 农村个体户需要报税吗
  • jsonp解决跨域问题spring3.0
  • 公章没有数字是什么情况
  • 谷歌浏览器被hao123锁定改不了
  • python 如何学
  • YOLOv5|YOLOv7|YOLOv8改各种IoU损失函数:YOLOv8涨点Trick,改进添加SIoU损失函数、EIoU损失函数、GIoU损失函数、α-IoU损失函数
  • 为什么电子章打印出是黑色的
  • 钱进公账怎么转账给别人
  • 小规模自开专票办理流程
  • 帝国cms整合Elasticsearch
  • mongodb简单使用
  • 加计抵减进项税额怎么计算
  • 公司汽车转卖给个人税率
  • 哪些增值税专用发票能抵扣进项税
  • mysql 5.5.x zip直接解压版安装方法
  • 红字转账凭证怎样录入
  • 企业所得税汇算表
  • 间接人工费用计入什么科目
  • 其他收益会计科目解释
  • 失控发票进项税额结转成本
  • 试驾车折旧残值怎么计算
  • 长期借款计提利息会计分录怎么做
  • 所有者权益的来源包括
  • 金融资产减值损失
  • 个体工商户怎样为员工缴纳社保
  • 其他应收款款项性质如何填写
  • 小规模需要进项税额吗
  • 房产开发企业以什么为主
  • ccs 运行
  • windowsserver2008r2忘记开机密码怎么办
  • win7任务管理器怎么打开
  • win10怎么查看windows版本
  • xp系统修改文件类型
  • xp系统蓝屏解决
  • win10开机自动启动软件怎么设置
  • linux user命令
  • 在linux系统中,用来存放系统所需要的
  • 推荐10 个很棒的电影
  • 基于web的学生成绩管理系统毕业论文
  • tensorflowoom
  • 我的第一个师父读后感
  • bootstrap-
  • typeof的缺点
  • 不用javascript可以吗
  • javascript $符号
  • 浙江电子税局
  • 新疆碧桂园三期最新消息
  • 诊所备案申请表在哪下载
  • 平顶山属于河南还是河北
  • 如何查询纳税人识别号
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设