1. 文档对象之间的关系

  1. 一对一 (one TO one)

    - 例如: 夫妻 (一个丈夫 对应 一个妻子)

    - 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系

演示:

首先在 my_test数据库中创建一个集合, wifeAndHusband, 并向集合中插入数据

{
name:"黄蓉",
husband:{
name:"郭靖"
}
> db.wifeAndHusband.find().pretty()
{
"_id" : ObjectId("6118eb8a47935623a0ff6300"),
"name" : "黄蓉",
"husband" : {
"name" : "郭靖"
}
}

一个文档对象一旦被嵌入到另一个文档对象中就绝不可能再被嵌入到其他文档对象中,因此可以体现出一对一的关系


  1. 一对多 (one TO many) / 多对一 (many TO one) 例如 :

    - 父母 To 孩子

    - 用户 To 订单

    - 文章 To 评论
  • 也可以通过内嵌文档来映射一对多的关系, 拿文章和评论举例, 一个文章可以包含多个评论, 只需要在文章中添加一个评论属性, 属性中包含的是一个数组, 数组中为多个评论对象
  • **问题**: 评论对于文章来说是可以无限多的, 但当评论中的数据多到一定程度后, 会造成单一数据库内存过大的问题,不利于维护

具体实现:

使用 用户 to 订单 距离

  1. 创建一个集合user, 插入以下数据
> db.user.insertMany([{name:'刘俊熙'},{name:'龙猫不热'}])
> db.user.find()

  1. 创建订单集合 order,插入数据
db.order.insertOne(
{
// 用户 刘俊熙对应的订单
list:['苹果','香蕉','西瓜']
}
)

但是这样还不能体现该订单是对应 刘俊熙数据的, 如何处理?

  • 刘俊熙数据的_id的值一起添加到 order集合中, 作为标识
db.order.insertOne(
{
list:['苹果','香蕉','西瓜'],
user_id:ObjectId("6118f452928b3b5423acb15f")
}
) db.order.find()



通过唯一性的_id作为参照插入到另一个文档对象中, 由此实现 一对多的关系

查询一对多

要求: 查询刘俊熙的订单

db.user.findOne({name:"刘俊熙"})._id

db.order.find({user_id:db.user.findOne({name:"刘俊熙"})._id})


  1. 多对多 (manyTO many)
  • 分类 - 商品
  • 老师 - 学生

例如: 在teachers集合中插入以下数据

db.teachers.insert([
{name:"洪七公"},
{name:"黄药师"},
{name:"龟仙人"} ]); db.teachers.find()

那么,要怎么体现出多对多的关系呢?

db.stus.insert([
// 如果, 郭靖既是洪七公的徒弟又是黄药师的徒弟,要怎么在数据库中体现呢?
{name:"郭靖"}
])

体现

db.stus.insert([
{
name:"郭靖",
tech_id:[
// 添加洪七公的 _id 作为tech_id 的其中一条数据
ObjectId("61192a9b928b3b5423acb166"),
// 再把洪七公的 _id 也添加进来
ObjectId("61192a9b928b3b5423acb167")
]
}
])

运行



这时候就能体现出 多对多的关系了


2. _sort 和 投影

2.1 _sort 排序

emp集合中执行db.emp.find()



可以看出, 默认情况下, 查询出来的数据是根据_id 由小到大升序排列

如果我们想要顺序按照工资sal排序要怎么办呢?

  • 在 MongoDB 中使用sort()方法对数据进行排序,sort() 方法可以通过参数指定排序的字段,并使用 1-1 来指定排序的方式,其中 1 为升序排列,而 -1 是用于降序排列

语法:

>db.COLLECTION_NAME.find().sort({KEY:1})

代码改变如下:

db.emp.find().sort({sal:1})



这时候就可以实现sal升序排列的效果了

那么这时候如果我们把代码改成下面这样, 运行结果又会是什么样的呢?

db.emp.find().sort({sal:1,empno:-1})

执行一下,我们来看效果

解释:

  • 如果在sort()方法中传入多个排序条件, 会先按照最前面的条件进行升序或降序, 如果两条数据的值一样, 则会再运行第二个排序条件
  • 拿上面的代码举例, 在排序的时候, 会先按照sal工资数据升序排列, 如果有两个员工的sal工资相同, 那么就会执行第二个排序条件, 按照empno部门编号降序排列

2.2 投影

在MongoDB中,投影表示仅选择所需要字段的数据,而不是选择整个文档字段的数据。如果某个文档有5个字段,但只要显示3个字段,那么就只选择3个字段吧,这样做是非常有好处的。

MongoDB的find()方法,在 MongoDB 查询文档中此方法接收的第二个可选参数是要检索的字段列表。 在MongoDB中,当执行find()方法时,它默认将显示文档的所有字段。为了限制显示的字段,需要将字段列表对应的值设置为101用于显示字段,而0用于隐藏字段

具有投影的find()方法的基本语法如下:

>db.COLLECTION_NAME.find({},{KEY:1})

emp集合中有以下数据



要求: 在查询的时候只显示 enamejob, 其他字段不显示, 代码如下:

> db.emp.find({},{ename:1,job:1})

这时候如果我们连 _id字段也不想显示要怎么做?

**注意**,在执行find()方法时,始终都会显示_id字段,如果不想要此字段,则需要将其设置为0

> db.emp.find({},{ename:1,job:1,_id:0})

MongoDB - 文档之间的关系 + _sort和投影的更多相关文章

  1. mongoDB 文档概念

    mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps:  bson ...

  2. mongoDB 文档操作_删

    mongoDB 文档删除 MySQL对比 mysql delete from table where ... mongo db.collection.deleteOne(query) 删除函数 del ...

  3. MongoDB文档的基本操作

    1. MongoDB的安装方法 (1)下载MongoDB 相应的版本: (2)设置数据文件和日志文件的存放目录: (3)启动MongoDB服务: (4)将MongoDB作为服务启动. 2. Mongo ...

  4. mongodb文档支持的数据类型

    版权声明:转载请标明来源. https://blog.csdn.net/u014285882/article/details/25510377 1. 存储类型 mongodb文档相似于json,但不是 ...

  5. MongoDB 文档的查询和插入操作

    MongoDB是文档型数据库,有一些专门的术语,和关系型DB相似,但也有差异,例如,Collection类似于关系型DB的Table,document类似于row,key/value pair类似于c ...

  6. MongoDB文档、集合、数据库简介

    文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个有序集.MongoDB使用Javascript shell,文档的表 ...

  7. mongoDB 文档操作_查

    基本查询命令 find 查找复合条件的所有文档 命令 db.collection.find(query,field) 参数 query 查找条件 格式: {ssss:"xxx"}是 ...

  8. 读《深入理解Elasticsearch》点滴-对象类型、嵌套文档、父子关系

    一.对象类型 1.mapping定义文件 "title":{ "type":"text" }, "edition":{ ...

  9. MongoDB文档(二)--查询

    (一)查询文档 查询文档可以使用以下方法 # 以非结构化的方式显示所有的文档 db.<collectionName>.find(document) # 以结构化的方式显示所有文档 db.& ...

随机推荐

  1. java网络编程基础——网络基础

    java网络编程 网络编程基础 1.常用的网络拓扑结构: 星型网络.总线网络.环线网络.树形网络.星型环线网络 2.通信协议的组成 通信协议通常由3部分组成: 语义部分:用于决定通信双方对话类型 语法 ...

  2. Leetcode1.两数之和——简洁易懂

    > 简洁易懂讲清原理,讲不清你来打我~ 输入一个数组和一个整数,从数组中找到两个元素和为这个整数,输出下标![在这里插入图片描述](https://img-blog.csdnimg.cn/img ...

  3. 【字符串+排序】宇宙总统 luogu-1781

    题目描述 地球历公元6036年,全宇宙准备竞选一个最贤能的人当总统,共有n个非凡拔尖的人竞选总统,现在票数已经统计完毕,请你算出谁能够当上总统. 分析 给字符串排个序. AC代码 #include & ...

  4. 【队列+模拟】机器翻译 luogu-1540

    题目描述 小晨的电脑上安装了一个机器翻译软件,他经常用这个软件来翻译英语文章. 这个翻译软件的原理很简单,它只是从头到尾,依次将每个英文单词用对应的中文含义来替换.对于每个英文单词,软件会先在内存中查 ...

  5. redis故障时的一些概念

    1.缓存穿透 概念访问一个不存在的key,缓存不起作用,请求会穿透到DB,流量大时DB会挂掉. 解决方案采用布隆过滤器,使用一个足够大的bitmap,用于存储可能访问的key,不存在的key直接被过滤 ...

  6. 2021最新Java基础知总结,助力大厂offer

    本文是我花了三周时间整理出来的,希望对Java初学者有帮助~ Java概述 Java的特点 Java是一门面向对象的编程语言.面向对象和面向过程是一种软件开发思想. 面向过程就是分析出解决问题所需要的 ...

  7. web知识架构思维导图

    图片双击放大还是很清晰的.原图大小5.1M

  8. C语言运算符(杂项运算符 ↦ sizeof & 三元)

    实列 1 #include <stdio.h> 2 3 int main() 4 { 5 int a = 4; 6 short b; 7 double c; 8 int* ptr; 9 1 ...

  9. 三、Linux部署MinIO分布式集群

    MinIO的官方网站非常详细,以下只是本人学习过程的整理 一.MinIO的基本概念 二.Windows安装与简单使用MinIO 三.Linux部署MinIO分布式集群 四.C#简单操作MinIO 一. ...

  10. 关于Tomcat服务器的笔记

    javaWEB的概念: a)什么是 JavaWeb:             JavaWeb 是指,所有通过 Java 语言编写可以通过浏览器访问的程序的总称,叫 JavaWeb. JavaWeb 是 ...