Mongodb数据库介绍
什么是MongoDB?
官网地址:
MongoDB 是由C++语言编写的编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统。
主要特点
- MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
- MongoDB使用了BSON存储数据和网络数据交换,BSON是一种类json的一种二进制形式的存储格式,简称Binary JSON,它和JSON一样,支持内嵌的文档对象和数组对象
- 可以在MongoDB记录中设置任何属性的索引 (如:FirstName=”Sameer”,Address=”8 Gandhi Road”)来实现更快的排序。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB支持各种编程语言:Nodejs,RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
MongoDB基本概念
- 文档:是MongoDB中数据的基本单元,非常类似于关系型数据库系统中的行(但是比行要复杂很多)
- 集合:就是一组文档,如果说MongoDB中的文档类似于关系型数据库中的行,那么集合就如同表
- MongoDB的单个计算机可以容纳多个独立的数据库,每一个数据库都有自己的集合和权限
- MongoDB自带简洁但功能强大的JavaScript shell,这个工具对于管理MongoDB实例和操作数据库作用非常大
- 每一个文档都有一个特殊的键”_id”,它在文档所处的集合中是唯一的,相当于关系数据库中的表的主键
MOngoDB常用数据类型
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型 |
Integer | 整型数值。用于存储数值 |
Boolean | 布尔值。用于存储布尔值(真/假) |
Double | 双精度浮点值。用于存储浮点值 |
Array | 用于将数组或列表或多个值存储为一个键 |
Timestamp | 时间戳。记录文档修改或添加的具体时间 |
Object | 用于内嵌文档 |
Null | 用于创建空值 |
Object ID | 对象 ID。用于创建文档的 ID |
Binary Data | 二进制数据。用于存储二进制数据 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息 |
与关系型数据(Mysql,Oracle)对比
安装MongoDB
macOs
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-os-x/
Linux
https://docs.mongodb.com/manual/administration/install-on-linux/
windows
https://docs.mongodb.com/manual/tutorial/install-mongodb-on-windows/
使用
启动
`path to binary`/mongod --dbpath `path to data directory`/data
如果没有配置MongoDB的环境变量,path to binary
就是MongoDB的安装目录下的bin目录
–dbpath 数据库数据存放位置
数据库操作基本上就是增,删,改,查这4个操作
下面分别介绍下。
我们这里使用MongoDB提供的shell来操作MongoDB数据库。
通过 shell 连接 MongoDB 服务:
$ ./mongo
MongoDB shell version v3.4.5
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.5
可以通过
show dbs
查看安装的全部数据列表,然后可以通过
use dbName
来切换数据库。
默认使用的是test数据库,我们在这个数据上操作
增
db.COLLECTION_NAME.insert(document)
COLLECTION_NAME是集合的名称,MongoDB可以不需要先创建集合,就可以直接插入数据,
document是文档内容
db.test.insert({name:'test','age':23, 'tags': ['mongodb', 'database', 'NoSQL'], 'likes':{name:'a',age:30}})
插入了一个文档
1 |
|
查
有两种方式
db.COLLECTION_NAME.findOne(query, projection)
db.COLLECTION_NAME.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)
findOne只返回一个文档; find返回全部文档
查看刚才插入的那条记录
1 | db.test.findOne() |
MongoDB AND 条件
MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,即常规 SQL 的 AND 条件。
db.test.find({key1:value1, key2:value2}).pretty()
MongoDB OR 条件
MongoDB OR 条件语句使用了关键字 $or,语法格式如下
db.col.find({$or: [{key1:value1}, {key2:value2}]}).pretty()
MongoDB比较运算符
数据操作 | 格式 | 范例 |
---|---|---|
等于 | {<key>:<value> } |
db.test.find({“name”:”test”}).pretty() |
小于 | {<key>:{$lt:<value>} } |
db.test.find({“age”:{$lt:20}}).pretty() |
小于等于 | {<key>:{$lte:<value>} } |
db.test.find({“age”:{$lte:20}}).pretty() |
大于 | {<key>:{$gt:<value>} } |
db.test.find({“age”:{$gt:20}}).pretty() |
大于等于 | {<key>:{$gte:<value>} } |
db.test.find({“age”:{$gte:20}}).pretty() |
不等于 | {<key>:{$ne:<value>} } |
db.test.find({“age”:{$ne:20}}).pretty() |
改
1 | db.collection.update( |
- query : update的查询条件,同find操作里面的查询条件。
- update : update的对象和一些更新的操作符(如$,$inc…)等,对于更新操作符可以查看https://docs.mongodb.com/manual/reference/operator/update/
- upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
- multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
例如把上面插入一条记录name=”test”的age变为50
db.test.update({"name":"test"},{$set:{age:50}})
db.test.findOne({"name":"test"})
{
"_id" : ObjectId("5b72f9069b0b40898aab3903"),
"name" : "test",
"age" : 50, // 原来是30
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : {
"name" : "a",
"age" : 30
}
}
删
db.collection.remove(
<query>,
<justOne>
)
- query :(可选)删除的文档的条件。
- justOne : (可选)如果设为 true 或 1,则只删除一个文档。
删除掉上面name=”test”的记录
db.test.remove({"name":"test"})
db.test.findOne({"name":"test"})
null
删除集合
db.collection.drop()
删除集合后在show collections里面就看不到这个集合了。
删除数据库
db.dropDatabase()
删除当前正在使用的数据库,删库需谨慎!!!删除以后在 show dbs里面就看不到了.
对于Nodejs来说,最为流行的库是Mongoose