iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >MongoDB中使用JOIN操作的方法
  • 496
分享到

MongoDB中使用JOIN操作的方法

2024-04-02 19:04:59 496人浏览 独家记忆
摘要

这篇文章给大家分享的是有关mongoDB中使用JOIN操作的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言MonGoDB是由c++语言所编写的一种面向文档的非关系型数据库

这篇文章给大家分享的是有关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操作的方法”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

您可能感兴趣的文档:

--结束END--

本文标题: MongoDB中使用JOIN操作的方法

本文链接: https://www.lsjlt.com/news/55055.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • MongoDB中使用JOIN操作的方法
    这篇文章给大家分享的是有关MongoDB中使用JOIN操作的方法的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前言MongoDB是由C++语言所编写的一种面向文档的非关系型数据库...
    99+
    2024-04-02
  • 使用GO操作MongoDB的方法
    目录安装MongoDB驱动程序连接MongoDB列出所有数据库从MongDB中查询数据查询单个文档查询多个文档更新多个文档删除MongoDB文档获取MongoDB服务状态安装Mong...
    99+
    2024-04-02
  • c#中mongodb的操作方法有哪些
    在C#中使用MongoDB操作数据的方法有以下几种: 使用官方提供的MongoDB.Driver库进行操作,该库提供了一系列的AP...
    99+
    2024-04-09
    c# mongodb
  • MongoDB中的聚合操作与管道使用方法是什么
    在MongoDB中,聚合操作是用于对文档进行数据处理和计算的操作。聚合操作通常通过聚合管道来实现,管道是由一系列操作组成的操作链,每...
    99+
    2024-05-07
    MongoDB
  • 如何使用Dapper使用Inner join的操作
    这篇文章主要介绍如何使用Dapper使用Inner join的操作,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!1、新创建两张表:Users表和Product表Users表定义如下:CREATE TABLE...
    99+
    2023-06-29
  • 使用mongoshake实现mongodb数据同步的操作方法
    目录前言使用场景搭建步骤环境准备一、搭建mongodb复制集二、mongoshake配置前言 MongoShake是阿里云以Golang语言编写的通用平台型服务工具,它通过读取Mon...
    99+
    2024-04-02
  • 利用Spring Boot操作MongoDB的方法教程
    MongoDBMongoDB作为一种NoSQL数据库产品,其实已经非常著名了。去年,由于MongoDB安全认证的薄弱,上万家公司中招。虽然是一则负面新闻,但是也从侧面说明了MongoDB的流行程度。下图是DB-Engines统计的2017年...
    99+
    2023-05-31
    springboot mongodb
  • Sprint Boot 集成MongoDB的操作方法
    mongodb是最早热门非关系数据库的之一,使用也比较普遍,一般会用做离线数据分析来使用,放到内网的居多。由于很多公司使用了云服务,服务器默认都开放了外网地址,导致前一阵子大批 MongoDB 因配置漏洞被攻击,数据被删,引起了人们的注意,...
    99+
    2023-05-30
    spring boot mongodb
  • python操作MongoDB的方法是什么
    这篇文章主要介绍“python操作MongoDB的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“python操作MongoDB的方法是什么”文章能帮助大家解决问题。MongoDB ...
    99+
    2023-06-28
  • liunx操作mongodb的方法有哪些
    在 Linux 系统下操作 MongoDB,可以使用以下方法:1. 命令行工具:MongoDB 提供了命令行工具 `mongo` 和...
    99+
    2023-09-12
    liunx mongodb
  • JAVA多线程中join()方法的使用方法
    虽然关于讨论线程join()方法的博客已经非常极其特别多了,但是前几天我有一个困惑却没有能够得到详细解释,就是当系统中正在运行多个线程时,join()到底是暂停了哪些线程,大部分博客...
    99+
    2024-04-02
  • 使用MongoDB操作文档
    目录一、插入文档1、使用insert()方法插入文档2、使用save()方法插入文档二、查询文档1、语法2、实例3、MongoDB AND条件查询4、MongoDB OR 条件查询三...
    99+
    2024-04-02
  • sql join on的使用方法
    这篇文章主要介绍“sql join on的使用方法”,在日常操作中,相信很多人在sql join on的使用方法问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”sql join...
    99+
    2024-04-02
  • SQL中join的使用方法是什么
    在SQL中,使用JOIN操作可以将两个或多个表中的行连接起来,以便进行数据查询和分析。JOIN操作的基本语法如下: SELEC...
    99+
    2023-10-26
    SQL join
  • Thread的Join方法有什么作用
    Thread类的join()方法用于等待该线程执行完毕。当一个线程调用另一个线程的join()方法时,调用线程将被阻塞,直到被调用线...
    99+
    2023-10-12
    Thread Join
  • 使用python语言操作MongoDB
    MongoDB是一个跨平台的NoSQL,基于Key-Value形式保存数据。其储存格式非常类似于Python的字典,因此用Python操作MongoDB会非常的容易。 pymongo的两种安装命令 pip install pym...
    99+
    2023-01-31
    语言 操作 python
  • join()方法如何在pandas中使用
    今天就跟大家聊聊有关join()方法如何在pandas中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。方式一:根据指定的分隔符将Series中的各个元素的字符串连接起来。impo...
    99+
    2023-06-14
  • Laravel 框架中使用 MongoDB 数据库的操作
    1、先确定好自己使用的哪个版本的 Laravel 框架,再决定 composer 哪一个的 MongoDB,我使用的是 Laravel 8 所以我 composer 了 3.8 的M...
    99+
    2024-04-02
  • join方法怎么在javascript中使用
    这篇文章将为大家详细讲解有关 join方法怎么在javascript中使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。JavaScript join() 方法定义和用法join() 方法用...
    99+
    2023-06-14
  • join()方法怎么在js中使用
    今天就跟大家聊聊有关join()方法怎么在js中使用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。1、说明join方法能把数组序列转换为字符串, join方法后面可以跟match方法...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作