非关系型数据库MongoDB入门
本文分为以下四块简单介绍非关系型数据库MongoDB:1.MongoDB简介、2.MongoDB和关系数据库对比、3.MongoDB基本概念、4.mongo shell的使用以及对MongoDB的增删改查操作
Ⅰ、MongoDB简介
MongoDB是一款基于分布式文件存储的数据库,是一种文档型数据库,是介于关系型和非关系型数据库之间的产品,是最接近关系型数据库的数据库。MongoDB中的每一条记录就是一个文档,是一个数据结构,由字段和值对组成,字段的值可能其他文档,数组,以及文档数组。一般用作离线数据分析使用,放在内网居多,提供高性能的数据持久化。
II、MongoDB和关系数据库对比
Ⅲ、MongoDB基本概念
- 集合(collection)就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表。
- 文档(document)是MongoDB中数据的基本单元,非常类似于关系型数据库系统中的行(但是比行要复杂的多)。
- MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限。
- MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据作用非常大。
- 每一个文档都有一个特殊的键”_id”,它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键。
Ⅳ、mongo shell的使用以及对MongoDB的增删改查操作
⑴ mongo shell的使用
安装好MongoDB后我们开始mongo Shell:在数据库运行的情况下进入我们MongoDB的安装目录下的mongo.exe可以直接打开mongo Shell,
db :显示当前正在使用的数据库
use <db> :进行当前使用的数据库切换
show dbs :显示当前所有可用的数据库
要在不切换当前数据库访问其他的数据库使用 db.getSiblingDB() 方法。
当切换到一个不存在的数据库在第一次插入数据时会进行数据库的创建操作
如果mongo Shell不接受我们输入的集合名称可以使用代替语法来代替:比如我们名称中包含空格或连字符”-”,或者以数字开始:若我们想要对集合名称为3test的集合进行操作则输入以下替代语法:
db[“3test”].find() 或者 db.getCollection(“3test”).find()
⑵ MongoDB数据库文档的增删改查操作
① 插入文档:
文档的数据结构和json基本一样,所存储在集合中的数据都是BSON格式(即JSON的一种二进制的存储格式,又称Binary JSON)插入文档使用如下函数:
collection表示集合的名称,插入时若此名称集合不存在则会自动创建此集合。若在插入操作中未指定_id字段,MongoDB会自动添加_id字段。
② 查询文档:
查询文档使用find方法:
db.collection.find( <query filter>, <projection> ):其中参数<query filter>是过滤条件,指明返回哪些文档,<projection> 指明返回文档的哪些字段,限制了返回数据量。
<query filter>参数的两种方式<field>:<value>形式和使用查询操作符<field1>: { <operator1>: <value1> }的形式
- db.users.find( { status: "A" } ) ==> 从users集合中检索status字段值为”A”的所有文档
- db.users.find( { status: { $in: [ "P", "D" ] } } ) ==> 从users集合中检索字段为”p”和”D”的所有文档
的所有文档
db.users.find( { status: "A", age: { $lt: 30 } } )
的所有文档
db.users.find({
$or: [ { status: "A" }, { age: { $lt: 30 } } ]
})
要么type等于1的所有文档
db.users.find({
status: "A",
$or: [ { age: { $lt: 30 } }, { type: 1 } ]
})
嵌入文档查询:
嵌入文档上的精确匹配:从users集合中查找出所有favorities字段只以该种顺序且只包含artist等于"Picasso"和food等于 "pizza"的所有内嵌文档
db.users.find( { favorites: { artist: "Picasso", food: "pizza" } } )
嵌入文档中字段等于匹配:查询所有favorities字段中含有artist等于"Picasso"(这里可能含有其他的字段)的内嵌文档
db.users.find( { "favorites.artist": "Picasso" } )
数组上的查询:(类似于嵌套文档的查询)
数组上的精确匹配:查询出所有badges字段是一个正好只有有"blue", "black" 这两个这种顺序的元素的数组的所有文档
db.users.find( { badges: [ "blue", "black" ] } )
匹配一个数组元素:查找users集合中badges字段数组中包含”black”元素(可能包含其他元素)的所有文档
db.users.find( { badges: "black" } )
匹配数组中指定的元素:查找出users集合中badges数组的第一个元素等于”black”的所有文档
db.users.find( { "badges.0": "black" } )
并且小于20的所有文档
db.users.find( { finished: { $elemMatch: { $gt: 15, $lt: 20 } } } )
的同时另一个元素小于20或者有一个元素同时满足大于15小于20的所有的文档
db.users.find( { finished: { $gt: 15, $lt: 20 } } )
嵌入文档数组查询:
的所有文档
db.users.find( { 'points.0.points': { $lte: 55 } } )
的所有文档。
db.users.find( { 'points.points': { $lte: 55 } } )
指定数组文档的多个查询条件:
并且bonus等于20的所有文档
db.users.find( { points: { $elemMatch: { points: { $lte: 70 }, bonus: 20 } } } )
并且同时另一个内嵌文档的bonus等于20或者有一个内嵌文档同时满足以上两个条件的所有文档。
db.users.find( { "points.points": { $lte: 70 }, "points.bonus": 20 } )
查找为null或者不存在的字段:
不能使用db.users.find( { name: null } ),这样会同时返回name字段等于null和不存在name字段的所有文档
使用类型筛查查找为null的文档:db.users.find( { name : { $type: 10 } } ) => 只查找name字段为null的所有文档
使用存在性筛查不存在字段的所有文档:db.users.find( { name : { $exists: false } } ) =>查找出不存在name字段的所有文档
==========================================================================================
上面讲完了查询的匹配条件,接下来是查询结果映射:也就是find函数第二个参数的意义
返回查询的映射字段:上面我们查询方法中的 <projection>文档,映射文档用来指明返回结果中包括和排除哪些字段,下面是<projection>文档(find方法的第二个参数)
{ field1: <value>, field2: <value> ... }
其中field字段名称,<value>的值为1或true表示在返回的文档中包含此字段,<value>的值为0或者false则返回的文档中不会包含此字段。若不显示指明_id的显示或隐藏则会默认返回文档中会包含_id字段,一个<projection>文档不能同时指定包括和排除的字段,除了排除_id字段,在显式包括字段的映射中_id字段是唯一一个可以显式排除的字段。
1. 查询返回users集合中status值为”A”的所有文档包含文档的所有字段
(1) db.users.find( { status: "A" } )
2. 在查询的结果集中只返回匹配文档的name,status以及默认的_id字段,同时也可以显式排除_id字段
(1) db.users.find( { status: "A" }, { name: 1, status: 1 } )
(2) db.users.find( { status: "A" }, { name: 1, status: 1, _id: 0 } )
3. 返回排除字段之外的所有的字段:返回favorites,points字段外所有字段
(1) db.users.find( { status: "A" }, { favorites: 0, points: 0 } )
4. 返回嵌入文档中指定字段和排除嵌入文档中的字段:(1)返回_id,status,name,和嵌入文档favorites中的food字段food字段仍然在嵌入文档favorites中。(2)返回排除嵌入文档favorites中food外的所有字段
(1) db.users.find({ status: "A" },{ name: 1, status: 1, "favorites.food": 1 })
(2) db.users.find({ status: "A" },{ "favorites.food": 0 })
5. 映射数组中的嵌入文档:返回name,status字段以及points数组文档中包含bonus字段的文档
(1) db.users.find( { status: "A" }, { name: 1, status: 1, "points.bonus": 1 } )
6. 映射返回数组中特定的数组元素:MongoDB包含下面映射操作符$elemMatch,$slice,以及$,他们是用来返回指定防范会数组中包含映射元素的唯一方式,不能使用数组索引来映射指定元素
==========================================================================================
③更新文档:
上面的更新方法传入的参数如下:
(1) 过滤条件文档:类似于sql的where,决定更些哪些文档
(2) 更新文档:类似于sql的set,指定要执行的修改或替换文档
(3) 选项文档:若包含upsert:true,当没有匹配到文档则会创建一个新文档并插入字段
更新文档中指定的字段:
使用$set操作符更新favorites.artist字段为"Pisanello",更新type字段值为3.
使用$currentDate 操作符更新 lastModified 字段的值到当前日期。如果 lastModified 字段不存在, $currentDate 会创建该字段。下面若使用updateOne函数则只会更新匹配得到的第一个文档
db.users.updateMany(
{ "favorites.artist": "Picasso" },
{
$set: { "favorites.artist": "Pisanello", type: 3 },
$currentDate: { lastModified: true }
}
)
若使用update函数来进行更新操作,则需要在选项文档中添加multi:true来指定更新单条还是所有的数据,默认更新单条数据
db.users.update(
{ "favorites.artist": "Pisanello" },
{
$set: { "favorites.food": "pizza", type: 0, },
$currentDate: { lastModified: true }
},
{ multi: true }
)
文档替换:
使用replaceOne函数进行替换操作:将name为abc匹配到的第一个文档替换为新文档
db.users.replaceOne(
{ name: "abc" },
{ name: "amy", age: 34, type: 2, status: "P", favorites: { "artist": "Dali", food: "donuts" } }
)
若update函数不使用操作符则会执行替换操作
db.users.update(
{ name: "xyz" },
{ name: "mee", age: 25, type: 1, status: "A", favorites: { "artist": "Mati", food: "ma" } }
)
注意:替换文档可以不同于原文档的字段。在替换文档中由于_id字段是不变的所以可以省略_id字段,若包含,则值必须和当前值相同
==========================================================================================
④删除文档:
上面的过滤参数和查询的时候相同,remove方法将<justone>参数设置为1来删除匹配到的第一个文档,默认会删除所有匹配到的文档
MongoDB入门教程到此结束,接下来会有MongoDB和springboot项目的集成使用案例
非关系型数据库MongoDB入门的更多相关文章
- 使用.Net+非关系型数据库MongoDB 实现LBS商家按距离排序_按离我最近排序
.Net MongoDB LBS地理位置定位 开发过程,实现商家按距离排序 前言: 在使用美团点外卖,看电影,找好吃的时候,经常会注意到软件有一个按距离排序,找离我最近的商家,心中有一些疑问,.Net ...
- 数据库基础 非关系型数据库 MongoDB 和 redis
数据库基础 非关系型数据库 MongoDB 和 redis 1 NoSQL简介 访问量增加,频繁的读写 直接访问(硬盘)物理级别的数据,会很慢 ,关系型数据库的压力会很大 所以,需要内存级的读写操作, ...
- 大数据时代的数据存储,非关系型数据库MongoDB
在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来解释数据库中抽象的数据架构. ...
- 大数据时代的数据存储,非关系型数据库MongoDB(一)
原文地址:http://www.cnblogs.com/mokafamily/p/4076954.html 爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Da ...
- 非关系型数据库MongoDB
爆炸式发展的NoSQL技术 在过去的很长一段时间中,关系型数据库(Relational Database Management System)一直是最主流的数据库解决方案,他运用真实世界中事物与关系来 ...
- Python3爬虫(十) 数据存储之非关系型数据库MongoDB
Infi-chu: http://www.cnblogs.com/Infi-chu/ 一.非关系型数据库NoSQL全程是Not Only SQL,非关系型数据库.NoSQL是基于键值对的,不需要经过S ...
- 非关系型数据库----MongoDB
一.什么是MongoDB? MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统. 在高负载的情况下,添加更多的节点,可以保证服务器性能. MongoDB 旨在为WEB应用提 ...
- 非关系型数据库mongodb的语法模式
from pymongo import MongoClient #连接 conn = MongoClient() #进入数据库 db = conn.edianzu #连接mydb数据库,没有则自动创建 ...
- 非关系型数据库MongoDB初级使用教程
安装:官网 安装难度不大,依序即可 1.新建存储文件 完成后,打开MongoDBx下载路径,新建名为data的文件夹,在此新建名为db的文件夹,db文件夹即用于存储数据 2.配置文件 在b ...
随机推荐
- 【Database】MySQL实战45讲
01 | 基础架构:一条SQL查询语句是如何执行的? 1. MySQL 的基本架构图: MySQL可以分成: Server层 和 存储引擎层 两部分. Server层:包含连接器.查询缓存.分析器.优 ...
- Django Rest框架 APIView源码调用
上一篇说了请求访问的流程,这一篇说一下请求对应的源码调用 as_view 定义view dispatch dispatch initialize_request get_parsers ...
- linux下各文件夹的结构及其用途说明
bin 二进制可执行命令 dev 设备特殊问题 etc 系统管理和配置文件 etc/rc或etc/rc.d或etc/rc?.d启动或改变运行级时运行的脚本或脚本的目录 etc/passwd 用户数据库 ...
- c++后台开发面试常见知识点总结(六)算法手写
链表倒转 leetcode-206 连续子数组最大和问题(和最大的连续子序列的和) leetcode-53 输出字符串中最长的回文子串长度? leetcode-5 一个字符串,求最长无重复子串 ...
- boost库:函数对象
函数对象是指那些可以被传入到其它函数或是从其它函数返回的一类函数. 1. boost::bind bind提供了一个机制,是函数与几乎不限数量的参数一起使用,就可以得到指定签名的函数.bind会复制传 ...
- 【JVM】内存区域
程序运行时,有六个地方都可以保存数据: 1. 寄存器:这是最快的保存区域,因为它位于和其他所有保存方式不同的地方:处理器内部.然而,寄存器的数量十分有限,所以寄存器是根据需要由编译器分配.我们对此没有 ...
- 分布式存储Ceph之PG状态详解
https://www.jianshu.com/p/36c2d5682d87 1. PG介绍 继上次分享的<Ceph介绍及原理架构分享>,这次主要来分享Ceph中的PG各种状态详解,PG是 ...
- 【dart学习】-- Dart之异步编程
一,概述 编程中的代码执行,通常分为同步与异步两种. 同步:简单说,同步就是按照代码的编写顺序,从上到下依次执行,这也是最简单的我们最常接触的一种形式.但是同步代码的缺点也显而易见,如果其中某一行或几 ...
- spring boot中读取配置文件的两种方式
application.properties test.name=测试 test.url=www.test.com 1.@Value注解 在controller里可以这样直接调用 @Value(&qu ...
- CKEditor的使用经历总结
关于ckeditor的下载和引用网上有很多完整清晰的教程,就不在此多说了,主要说一些小问题. 这个插件,初次用的时候放不进背景图,放不进隐藏域,连class,id这些属性都放不进去,然后我进行了一些调 ...