MongoDB存储基础教程
一、MongoDB简介
1. mangodb是一种基于分布式、文件存储的非关系型数据库
2. C++写的,性能高
3. 为web应用提供可扩展的高性能数据存储解决方案
4. 所支持的格式是json格式
二、MongoDB三元素&和关系型数据库的区别
三元素:数据库 集合(类似关系型数据库的表) 文档(类似关系型数据库中的行)
文档:就是一个对象,由键值对构成{"name":"zhangsan","age":33}
集合:类似于数据库中的表,储存多个文档,结构不固定
{"name":"zhangsan","age":33}
{"name":"zhangsan","age":33}
{"book":"python","price":33}
数据库:是一个集合的物理容器,一个数据库可以包含多个文档
| SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 数据库表/集合 |
| row | document | 数据记录行/文档 |
| column | field | 数据字段/域 |
| index | index | 索引 |
| table joins | 表连接,MongoDB不支持 | |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
三、MongoDB自带的数据库
admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。
local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
test:MongoDB的默认数据库是test。 如果没有创建任何数据库,那么集合将被保存在测试数据库。
四、MongoDB数据库命令
mongod 开启服务器
mongo 开启客户端
show dbs 显示所有数据库列表
db 显示当前数据库对象/集合
use 连接到一个指定的数据库;如果数据库不存在,会被创建。
db.dropDatabase() 删除选定的数据库
注意:show dbs要显示数据库,需要插入一个文档进去。
五、集合(表)的创建
MongoDB中使用db.createCollection(name,option)用来创建集合
name 是要创建集合的名称。
option 用于指定集合的配置,(可选)指定有关内存大小和索引选项
db.createCollection("myconllection") 创建集合
show collections 检查创建的集合
db.COLLECTION_NAME.drop() 删除集合 : db.myconllection.drop()
在MongoDB中可以不创建集合,当插入一些文档的时候MongoDB会自动创建集合。
六、文档(一行记录)
文档是一组键值对。MongoDB不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大区别,也是MongoDB的特点。
文档中的键/值对是有序的。
文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
MongoDB区分类型和大小写。
MongoDB的文档不能有重复的键。
文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
七、MongoDB中的数据类型
| 数据类型 | 描述 |
|---|---|
| String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
| Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
| Boolean | 布尔值。用于存储布尔值(真/假)。 |
| Double | 双精度浮点值。用于存储浮点值。 |
| Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
| Array | 用于将数组或列表或多个值存储为一个键。 |
| Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
| Object | 用于内嵌文档。 |
| Null | 用于创建空值。 |
| Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
| Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
| Object ID | 对象 ID。用于创建文档的 ID。 |
| Binary Data | 二进制数据。用于存储二进制数据。 |
| Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
| Regular expression | 正则表达式类型。用于存储正则表达式。 |
八、文档的插入
MongoDB中使用insert()和save()方法向集合中插入文档,语法如下:
db.collection_name.insert()
db.mycol.insert({
_id: 1,
title: 'MongoDB Overview',
description: 'MongoDB is no sql database',
by: 'weiheng',
url: 'http://www.weiheng.site',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 1,
})
如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId。
ObjectId的生成规则: _id: ObjectId(4 bytes timestamp, 3 bytes machine id, 2 bytes process id, 3 bytes incrementer)
要在集合中插入多个文档,可以在insert()命令中传递文档数组:
db.mycollection.insert([
{
"_id":2,
"title":"MongoDB Overview",
"descrption":"MongoDB is no sql database",
"by":"weiheng",
"url":"http://www.weiheng.site",
"likes":1,
},
{
"_id":3,
"title":"MongoDB Overview",
"descrption":"MongoDB is no sql database",
"by":"weiheng",
"url":"http://www.weiheng.site",
"likes":1,
},
])
db.collection_name.insertOne()
将单个文档插入集合中,该方法返回包含新插入文档的_id.
db.inventory.insertOne(
{
item: "canvas",
qty: 100,
tags: ["cotton"],
size: { h: 28, w: 35.5, uom: "cm"}
}
)
返回结果
db.inventory.insertOne(
... { item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5955220846be576f199feb55")
}
db.collection_name.insertMany()
方法将多个文档插入到集合中,可将一系列文档传递给它。insertMany()返回包含新插入的文档_id字段值的文档。
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
返回结果
db.inventory.insertMany([
... { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
... { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
... { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
... ])
{
"acknowledged" : true,
"insertedIds" : [
ObjectId("59552c1c46be576f199feb56"),
ObjectId("59552c1c46be576f199feb57"),
ObjectId("59552c1c46be576f199feb58")
]
}
九、MongoDB文档的查询
要从MongoDB集合中查询数据,需要使用MongoDB的find()方法
find()命令基本语法:
db.collection_name.find(document)
find()会以非结构化的方式显示所有文档内容:
{ "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 2, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 3, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
{ "_id" : 4, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
pretty():格式化数据并显示结果:
db.collection_name.find().pretty()
{
"_id" : ObjectId("5b5eb4d81cec3f1204a88699"),
"id" : 1,
"title" : "MongoDB Overview",
"descrption" : "MongoDB is no sql database",
"by" : "weiheng",
"url" : "http://www.weiheng.site",
"likes" : 1
}
除了find()还有findOne()它只会返回一个文档;默认返回第一个:
findOne()语法:
db.collenction_name.findOne()
十、条件操作&比较运算符
操作 语法 示例 RDBMS等效语句
相等 {<key>:<value>} db.mycol.find({"by":"weiheng"}).pretty() where by = 'weiheng'
小于 {<key>:{$lt:<value>}} db.mycol.find({"likes":{$lt:50}}).pretty() where likes < 50
小于等于 {<key>:{$lte:<value>}} db.mycol.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {<key>:{$gt:<value>}} db.mycol.find({"likes":{$gt:50}}).pretty() where likes > 50
大于等于 {<key>:{$gte:<value>}} db.mycol.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {<key>:{$ne:<value>}} db.mycol.find({"likes":{$ne:50}}).pretty() where likes != 50
(1) 在find()中,如果将条件以,分割,则MongoDB将其视为AND操作
db.mycol.find({$and: [{key1: value1}, {key2:value2}]})
# by为weiheng,title为MongoDB Overview的文章
db.mycollection.findOne({
$and:[
{"by":"weiheng"},
{"title":"MongoDB Overview"}
]
})
(2) MongoDB中的OR操作符。基本语法和AND相同
db.mycol.find({$or: [{key1: value1}, {key2:value2}]})
db.mycollection.findOne({
$or:[
{"by":"weiheng"},
{"title":"MongoDB Overview"}
]
})
(3) AND和OR
db.mycol.find({key:value,$or: [{key1: value1}, {key2:value2}]})
十一、update()更新操作
MongoDB中使用Update将集合中的文档进行更新,update()方法更新现有文档中的值,而save()方法使用save()方法中传递的文档数据替换现有文档。
update语法:
db.COLLECTION_NAME.update(SELECTION_CRITERIA, UPDATED_DATA)
示例:修改id为1的title
// 查看id:1的信息
db.mycollection.find({'id':1}) { "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB Overview", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 } // 修改一下title为MongoDB
db.mycollection.update({'id':1},{"$set":{"title":"MongoDB"}})
// 再次查询
db.mycollection.find({'id':1}) { "_id" : ObjectId("5b5eb4d81cec3f1204a88699"), "id" : 1, "title" : "MongoDB", "descrption" : "MongoDB is no sql database", "by" : "weiheng", "url" : "http://www.weiheng.site", "likes" : 1 }
十二、remove() & deleteOne() & deleteMany() 删除操作
MongoDB中的 remove()方法用于从集合中删除文档。(官方不推荐使用remove(),推荐deleteOne和deleteMany())
remove()方法的基本语法如下:
db.COLLECTION_NAME.remove(DELLETION_CRITTERIA)
示例: 删除id为1的数据
// 以下示例将删除_id为“100”的文档。
db.mycollection.remove({'id':1})
官方推荐使用 deleteOne() 和 deleteMany() 方法:
db.inventory.deleteMany({title: "MongoDB" })
db.inventory.deleteOne({title: "MongoDB" })
MongoDB存储基础教程的更多相关文章
- Asp.Net Core Web Api图片上传(一)集成MongoDB存储实例教程
Asp.Net Core Web Api图片上传及MongoDB存储实例教程(一) 图片或者文件上传相信大家在开发中应该都会用到吧,有的时候还要对图片生成缩略图.那么如何在Asp.Net Core W ...
- Core Data数据持久性存储基础教程-备用
摘要 就像我一直说的,Core Data是iOS编程,乃至Mac编程中使用持久性数据存储的最佳方式,本质上来说,Core Data使用的就是SQLite,但是通过一系列特性避免了使用SQL的一些列的麻 ...
- iOS教程:Core Data数据持久性存储基础教程
目录[-] 创建Core Data工程 创建数据模型 测试我们的数据模型 来看看SQL语句的真面目 自动生成的模型文件 创建一个表视图 之后看些什么? 就像我一直说的,Core Data是iOS编程, ...
- Mongodb最基础入门教程
Mongodb最基础入门教程 如果想了解一下redis的入门教程,可以去看一下我的上一篇博客 Mongodb的安装大家可以参考一下其他博主的博客,这里我就不做介绍了.不过值得注意的是,在Linux ...
- MongoDB基础教程系列--未完待续
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
上一篇我们介绍了如何通过Nacos的配置功能来存储限流规则.Apollo是国内用户非常多的配置中心,所以,今天我们继续说说Spring Cloud Alibaba Sentinel中如何将流控规则存储 ...
- Spring Cloud Alibaba基础教程:Sentinel使用Nacos存储规则
通过上一篇<使用Sentinel实现接口限流>的介绍,相信大家对Sentinel已经有了初步的认识.在Spring Cloud Alibaba的整合封装之下,接口限流这件事情可以非常轻易的 ...
- MongoDB基础教程系列--目录结构
最近对 MongoDB 产生兴趣,在网上找的大部分都是 2.X 版本,由于 2.X 与 3.X 差别还是很大的,所以自己参考官网,写了本系列.MongoDB 的知识还是很多的,本系列会持续更新,本文作 ...
- mongodb,Mysql,redis基础教程
数据库基础 1:mongodb基础教程 1:pymongo基础教程 2:Mysql基础教程 3:redis基础教程
随机推荐
- PerfMon Metrics Collector插件的Disks I/O使用总结
做Jmeter测试的时候如果想要统计磁盘的IO读写速度,那么很容易想到用PerfMon Metrics Collector这个插件,但是具体使用过程中还有以下需要注意的. 1.如下图首先,需要选择监控 ...
- 【转】Mysql事务,并发问题,锁机制
转自:http://www.cnblogs.com/fidelQuan/p/4549068.html 1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID,4个特点. 原子性:要不全部成 ...
- C# 项目迁移 Microsoft.VisualStudio.Tools.Office.BuildTasks 生成解决方法报错:请确认 <UsingTask> 声明正确,该程序集及其所有依赖项都可用
问题定位: 1.在Server2003上使用vs2010开发的项目,移到Win8上,同样使用vs2010打开.在生成解决方案的时候有如下报错: 未能从程序集 Microsoft.VisualStudi ...
- SVN for Mac
SVN for Mac https://www.wikihow.com/Install-Subversion-on-Mac-OS-X https://subversion.apache.org/pac ...
- 页面用一个遮罩层显示加载,加载完后隐藏该div
<div id="background" class="background" style="display: none; "> ...
- Python day5 --------递归、匿名函数、高阶函数、内置函数
一.递归 在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归要求: 1. 必须有一个明确的结束条件 2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减 ...
- 【刷题】BZOJ 1823 [JSOI2010]满汉全席
Description 满汉全席是中国最丰盛的宴客菜肴,有许多种不同的材料透过满族或是汉族的料理方式,呈现在數量繁多的菜色之中.由于菜色众多而繁杂,只有极少數博学多闻技艺高超的厨师能够做出满汉全席,而 ...
- 【刷题】LOJ 6122 「网络流 24 题」航空路线问题
题目描述 给定一张航空图,图中顶点代表城市,边代表两个城市间的直通航线.现要求找出一条满足下述限制条件的且途经城市最多的旅行路线. 从最西端城市出发,单向从西向东途经若干城市到达最东端城市,然后再单向 ...
- Hello,Power BI
Power BI 是什么 Power BI 是一套业务分析工具,用于分析数据和理解数据,快速便捷地监控数据变化,为商务决策提供依据. Power BI 有用户组的概念.分享权限等概念 Power BI ...
- 【转】METADATATYPE的使用,MVC的MODEL层数据验证
http://www.cnblogs.com/chshnan/archive/2011/07/08/2100713.html MetadataType的使用,MVC的Model层数据验证指定要与数据模 ...