Mongodb数据库介绍

什么是MongoDB?

官网地址:

https://www.mongodb.com/

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
2
3
4
5
6
7
8
9

{
"name":"test",
"age":23,
"tags": ["mongodb", "database", "NoSQL"],
"likes":{
"name":"a",age:30
}
}

有两种方式

db.COLLECTION_NAME.findOne(query, projection)

db.COLLECTION_NAME.find(query, projection)
  • query :可选,使用查询操作符指定查询条件
  • projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)

findOne只返回一个文档; find返回全部文档

查看刚才插入的那条记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
db.test.findOne()

{
"_id" : ObjectId("5b72f9069b0b40898aab3903"),
"name" : "test",
"age" : 23,
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : {
"name" : "a",
"age" : 30
}
}

db.test.find().pretty()

{
"_id" : ObjectId("5b72f9069b0b40898aab3903"),
"name" : "test",
"age" : 23,
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : {
"name" : "a",
"age" : 30
}
}
{
"_id" : ObjectId("5b72fa959b0b40898aab3904"),
"name" : "test2",
"age" : 24,
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : {
"name" : "b",
"age" : 31
}
}

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
2
3
4
5
6
7
8
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>
}
)
  • 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