MongoDB - 文档之间的关系 + _sort和投影
1. 文档对象之间的关系
- 一对一 (one TO one)
- 例如: 夫妻 (一个丈夫 对应 一个妻子)
- 在MongoDB中, 可以通过内嵌文档的形式来体现出一对一的关系
演示:
首先在 my_test数据库中创建一个集合, wifeAndHusband, 并向集合中插入数据
{
name:"黄蓉",
husband:{
name:"郭靖"
}
> db.wifeAndHusband.find().pretty()
{
"_id" : ObjectId("6118eb8a47935623a0ff6300"),
"name" : "黄蓉",
"husband" : {
"name" : "郭靖"
}
}
一个文档对象一旦被嵌入到另一个文档对象中就绝不可能再被嵌入到其他文档对象中,因此可以体现出一对一的关系
- 一对多 (one TO many) / 多对一 (many TO one) 例如 :
- 父母 To 孩子
- 用户 To 订单
- 文章 To 评论
- 也可以通过内嵌文档来映射一对多的关系, 拿文章和评论举例, 一个文章可以包含多个评论, 只需要在文章中添加一个评论属性, 属性中包含的是一个数组, 数组中为多个评论对象
**问题**:评论对于文章来说是可以无限多的, 但当评论中的数据多到一定程度后, 会造成单一数据库内存过大的问题,不利于维护
具体实现:
使用 用户 to 订单 距离
- 创建一个集合
user, 插入以下数据
> db.user.insertMany([{name:'刘俊熙'},{name:'龙猫不热'}])
> db.user.find()

- 创建订单集合
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})

- 多对多 (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()方法时,它默认将显示文档的所有字段。为了限制显示的字段,需要将字段列表对应的值设置为1或0。1用于显示字段,而0用于隐藏字段。
具有投影的find()方法的基本语法如下:
>db.COLLECTION_NAME.find({},{KEY:1})
在emp集合中有以下数据

要求: 在查询的时候只显示 ename和 job, 其他字段不显示, 代码如下:
> db.emp.find({},{ename:1,job:1})

这时候如果我们连 _id字段也不想显示要怎么做?
**注意**,在执行find()方法时,始终都会显示_id字段,如果不想要此字段,则需要将其设置为0。
> db.emp.find({},{ename:1,job:1,_id:0})

MongoDB - 文档之间的关系 + _sort和投影的更多相关文章
- mongoDB 文档概念
mongoDB 文档概念 什么是文档 文档是 mongodb 基本的数据组织单元,类似于mysql 中的记录 文档由多个键值对组成,每个键值对表达一个数据项 属于 bson 数据 ps: bson ...
- mongoDB 文档操作_删
mongoDB 文档删除 MySQL对比 mysql delete from table where ... mongo db.collection.deleteOne(query) 删除函数 del ...
- MongoDB文档的基本操作
1. MongoDB的安装方法 (1)下载MongoDB 相应的版本: (2)设置数据文件和日志文件的存放目录: (3)启动MongoDB服务: (4)将MongoDB作为服务启动. 2. Mongo ...
- mongodb文档支持的数据类型
版权声明:转载请标明来源. https://blog.csdn.net/u014285882/article/details/25510377 1. 存储类型 mongodb文档相似于json,但不是 ...
- MongoDB 文档的查询和插入操作
MongoDB是文档型数据库,有一些专门的术语,和关系型DB相似,但也有差异,例如,Collection类似于关系型DB的Table,document类似于row,key/value pair类似于c ...
- MongoDB文档、集合、数据库简介
文档 概述 文档是MongoDB的核心概念,是数据的基本单元,非常类似于关系数据库中的行.在MongoDB中,文档表示为键值对的一个有序集.MongoDB使用Javascript shell,文档的表 ...
- mongoDB 文档操作_查
基本查询命令 find 查找复合条件的所有文档 命令 db.collection.find(query,field) 参数 query 查找条件 格式: {ssss:"xxx"}是 ...
- 读《深入理解Elasticsearch》点滴-对象类型、嵌套文档、父子关系
一.对象类型 1.mapping定义文件 "title":{ "type":"text" }, "edition":{ ...
- MongoDB文档(二)--查询
(一)查询文档 查询文档可以使用以下方法 # 以非结构化的方式显示所有的文档 db.<collectionName>.find(document) # 以结构化的方式显示所有文档 db.& ...
随机推荐
- 解决远程连接服务器数据库报错:Host ‘XXXXXX’ is blocked because of many connection errors
参考:https://blog.csdn.net/li_li_lin/article/details/72764683和 https://blog.csdn.net/zaishijizhidian/a ...
- CSS 四种样式表 六种规则选择器 五种常用样式属性
新的html程序要在VS中编写了,在vs中安装ASP.NET和Web开发,并用ASP.NET Web 应用程序(.NETFramework)创建一个网页程序.添加一个html页 后面的代码都是在htm ...
- Linux bash命令行常用快捷键(Xshell和secure CRT以及gnome-terminal)
常用的命令行击键操作 ctrl + insert xshell中复制,可以设置选中内容自动复制ctrl shift + c crt中复制shift + insert xshell中粘贴ctrl s ...
- 静态Web服务器(py版)
近来,对http协议进行了研究,闲来无事.自己使用python3写了个静态Web服务器,以下是代码: static_Web_sever.py ''' 思路:首先使用socket创建tcp服务器,照旧绑 ...
- 群晖NAS网络存储服务器防盗防小偷
群晖NAS网络存储服务器防盗防小偷 根据群晖NAS的实际测量外形尺寸到淘宝网邮购金属 配电箱(弱电箱). 把配电箱(弱电箱)用粗螺丝固定到机柜或墙壁上. 把群晖NAS用密码纯铜挂锁锁在配电箱(弱电箱 ...
- 终拿字节Offer...动态规划复盘...
大家好!我是 Johngo 呀! 和大家一起刷题不快不慢,没想到已经进行到了第二阶段,「动态规划」这部分题目很难,而且很不容易理解,目前我的题目做了一半,凭着之前对于「动态规划」的理解和最近做的题目做 ...
- 并发编程——认识java里的线程
本文系作者 chaoCode原创,转载请私信并在文章开头附带作者和原文地址链接. 违者,作者保留追究权利. 前言 并发编程在我们日常开发中是时时刻刻都有在用的,只不过大部分的代码底层已经帮我们去做了一 ...
- 单片机学习(一)项目的建立和vscode代码编辑环境的设置
目录 Keil项目的建立 使用vscode进行开发 工欲善其事必先利其器,因此我们先搭建一个比较舒服的开发环境. Keil项目的建立 打开Keil软件点击Project/New uVision Pro ...
- Android无障碍宝典-talkback
http://geek.csdn.net/news/detail/93269 http://geek.csdn.net/news/detail/135867
- 我说AOP(面向切面编程)--藏在苹果里的五角星
这只是一篇入门理解! 一直听说AOP的名字,却从未使用过,因为我不会.但--那只是曾经-- 先看官方解释:AOP(Aspect-Oriented Programming,面向切面的编程),它是可以通过 ...