我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MongoDB中使用JOIN操作的方法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MongoDB中使用JOIN操作的方法

这篇文章给大家分享的是有关MongoDB中使用JOIN操作的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

前言

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

SELECT book.title, publisher.name
FROM book
LEFT JOIN book.publisher_id ON publisher.id;

换句话说,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数据集合来创建一个社交平台,在每个独立的文档中存储没个用户的信息,例如:

{
 "_id": ObjectID("45b83bda421238c76f5c1969"),
 "name": "User One",
 "email: "userone@email.com",
 "country": "UK",
 "dob": ISODate("1999-09-13T00:00:00.000Z")
}

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

{
 "_id": ObjectID("17c9812acff9ac0bba018cc1"),
 "user_id": ObjectID("45b83bda421238c76f5c1969"),
 "date: ISODate("2016-09-05T03:05:00.123Z"),
 "text": "My life story so far",
 "rating": "important"
}

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

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

{ "$match": { "rating": "important" } }

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

{ "$sort": { "date": -1 } }

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

{ "$limit": 20 }

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

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

      2、from:需要连接的集合

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

      4、as:输出的字段名字

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

{ "$lookup": {
 "localField": "user_id",
 "from": "user",
 "foreignField": "_id",
 "as": "userinfo"
} }

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

"userinfo": [
 { "name": "User One", ... }
]

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

{ "$unwind": "$userinfo" }

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

"userinfo": {
 "name": "User One",
 "email: "userone@email.com",
 …
}

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

{ "$project": {
 "text": 1,
 "date": 1,
 "userinfo.name": 1,
 "userinfo.country": 1
} }

合并上面所有的操作

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

db.post.aggregate([
 { "$match": { "rating": "important" } },
 { "$sort": { "date": -1 } },
 { "$limit": 20 },
 { "$lookup": {
 "localField": "user_id",
 "from": "user",
 "foreignField": "_id",
 "as": "userinfo"
 } },
 { "$unwind": "$userinfo" },
 { "$project": {
 "text": 1,
 "date": 1,
 "userinfo.name": 1,
 "userinfo.country": 1
 } }
]);

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

[
 {
 "text": "The latest post",
 "date: ISODate("2016-09-27T00:00:00.000Z"),
 "userinfo": {
  "name": "User One",
  "country": "UK"
 }
 },
 {
 "text": "Another post",
 "date: ISODate("2016-09-26T00:00:00.000Z"),
 "userinfo": {
  "name": "User One",
  "country": "UK"
 }
 }
 ...
]

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

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

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

感谢各位的阅读!关于“MongoDB中使用JOIN操作的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MongoDB中使用JOIN操作的方法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Node.js中使用mongoose操作mongodb数据库的方法

如何利用mongoose将数据写入mongodb数据库? 1.利用npm下载安装mongoose;npm install mongoose2.建立js文件,引入mongoosevar mongoose = require('mongoose
2022-06-04

如何高效使用 Java 中的 join 方法?(如何使用Java中的join方法)

在Java编程中,join方法是一个非常实用的工具,它允许我们将多个线程合并为一个线程,等待所有线程完成后再继续执行后续代码。本文将详细介绍如何使用Java中的join方法,并提供一些实际的代码示例,帮助你更好地理解和应用这个方法。
如何高效使用 Java 中的 join 方法?(如何使用Java中的join方法)
Java2024-12-14

MongoDB中的聚合操作与管道使用方法是什么

在MongoDB中,聚合操作是用于对文档进行数据处理和计算的操作。聚合操作通常通过聚合管道来实现,管道是由一系列操作组成的操作链,每个操作会依次处理输入文档并将结果传递给下一个操作。聚合操作和管道的使用方法如下:使用聚合操作实现对文档的数
MongoDB中的聚合操作与管道使用方法是什么
2024-05-07

mysql 使用join进行多表关联查询的操作方法

本文介绍了MySQL多表关联查询(JOIN)的操作方法,包括JOIN条件、JOIN类型(INNERJOIN、LEFTJOIN、RIGHTJOIN、FULLJOIN)、JOIN语法和示例。此外,还介绍了高级JOIN选项,如NATURALJOIN、USINGJOIN和CROSSJOIN。最后,提供了优化JOIN查询的建议,如创建索引和选择较小的表作为左表。通过理解这些概念,用户可以创建高效的关联查询,提取有意义的信息并提高应用程序性能。
mysql 使用join进行多表关联查询的操作方法
2024-04-02

c#中mongodb的操作方法有哪些

在C#中使用MongoDB操作数据的方法有以下几种:使用官方提供的MongoDB.Driver库进行操作,该库提供了一系列的API方法,包括连接数据库、插入、更新、删除、查询等操作。使用第三方库如MongoDB.CSharpDriver、
c#中mongodb的操作方法有哪些
2024-04-09

如何使用Dapper使用Inner join的操作

这篇文章主要介绍如何使用Dapper使用Inner join的操作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、新创建两张表:Users表和Product表Users表定义如下:CREATE TABLE [dbo
2023-06-29

利用Spring Boot操作MongoDB的方法教程

MongoDBMongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是一则负面新闻,但是也从侧面说明了MongoDB的流行程度。下图是DB-Engines统计的2017年
2023-05-31

Sprint Boot 集成MongoDB的操作方法

mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,
2023-05-30

python操作MongoDB的方法是什么

这篇文章主要介绍“python操作MongoDB的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python操作MongoDB的方法是什么”文章能帮助大家解决问题。MongoDB 是一个基
2023-06-28

liunx操作mongodb的方法有哪些

在 Linux 系统下操作 MongoDB,可以使用以下方法:1. 命令行工具:MongoDB 提供了命令行工具 `mongo` 和 `mongod`,可以通过命令行工具来管理和操作 MongoDB 数据库。例如,可以使用 `mongo`
2023-09-12

Node.js中使用mongoskin操作mongoDB实例

一、废话 从13年1月份接触mongodb进行开发,开发了旅游标签服务、微博标签检索系统、地图服务、web APP服务...使用MongoDB的场景从.NET、JAVA环境转到了node.js平台。越发觉Node.js和mongodb结合感
2022-06-04

MySQL的JOIN操作在HBase中的替代方案

HBase是一个基于列族的分布式NoSQL数据库,它与传统的关系型数据库(如MySQL)在数据模型、查询方式和存储结构上有很大的不同。因此,MySQL中的JOIN操作在HBase中没有直接的替代方案。但是,你可以通过以下方法在HBase中实
MySQL的JOIN操作在HBase中的替代方案
2024-10-19

SQL中join的使用方法是什么

在SQL中,使用JOIN操作可以将两个或多个表中的行连接起来,以便进行数据查询和分析。JOIN操作的基本语法如下:SELECT 列名FROM 表1JOIN 表2ON 表1.列名 = 表2.列名其中,表1和表2是要连接的两个表,ON
2023-10-26

mysql中join的使用方法是什么

在MySQL中,JOIN用于从多个表中检索相关数据。JOIN子句用于将两个或多个表中的行连接在一起,根据这些表之间的关系。JOIN子句可以根据不同的关键字将表连接在一起,包括INNER JOIN、LEFT JOIN、RIGHT JOIN和F
mysql中join的使用方法是什么
2024-05-21

编程热搜

目录