MongoDB怎么用?

MongoDB 简介

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。

MongoDB 属于 NoSQL

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值 (key=>value) 对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

类似于 json 的数据形式

 

MongoDB 的主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。
  • 你可以在 MongoDB 记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road") 来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得 MongoDB 有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo 支持丰富的查询表达式。查询指令使用 JSON 形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用 update() 命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb 中的 Map/reduce 主要是用来对数据进行批量处理和聚合操作。
  • Map 和 Reduce。Map 函数调用 emit(key,value) 遍历集合中所有的记录,将 key 与 value 传给 Reduce 函数进行处理。
  • Map 函数和 Reduce 函数是使用 Javascript 编写的,并可以通过 db.runCommand 或 mapreduce 命令来执行 MapReduce 操作。
  • GridFS 是 MongoDB 中的一个内置功能,可以用于存放大量小文件。
  • MongoDB 允许在服务端执行脚本,可以用 Javascript 编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB 支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C# 等多种语言。
  • MongoDB 安装简单。

 

NoSQL 简介

NoSQL(NoSQL = Not Only SQL),意即 "不仅仅是 SQL"。

在现代的计算系统上每天网络上都会产生庞大的数据量。

这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970 年 E.F.Codd's 提出的关系模型的论文"A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。

通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。

NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至 2009 年趋势越发高涨。NoSQL 的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。

NoSQL,指的是非关系型的数据库。NoSQL 有时也称作 Not Only SQL 的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL 用于超大规模数据的存储。(例如谷歌或 Facebook 每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

 

下载安装 MongoDB

官网链接    https://www.mongodb.com/download-center?jmp=nav

 

 启动 MongoDB

启动之前要先添加环境变量

MongoDB 服务端启动的命令为 mongod

配置数据存放的位置, 服务就可以正常的启动

我将配置放在专门的配置文件中

dbpath=E:\mongodb_data\data

启动时指定配置文件

mongod –config c:\mongodb\conf\master.cfg

 进入 MongoDB 的客户端

mongo

数据库操作

show dbs;                  #查看全部数据库

show collections;          #显示当前数据库中的集合(类似关系数据库中的表)

show users;                #查看当前数据库的用户信息

use <db name>;             #切换数据库跟 mysql 一样

db; 或者 db.getName();        #查看当前所在数据库

db.help();                 #显示数据库操作命令,里面有很多的命令 
db.foo.help();             #显示集合操作命令,同样有很多的命令,foo 指的是当前数据库下,一个叫 foo 的集合,并非真正意义上的命令 
db.foo.find();             #对于当前数据库中的 foo 集合进行数据查找(由于没有条件,会列出所有数据) 
db.foo.find({ a : 1} );  #对于当前数据库中的 foo 集合进行查找,条件是数据中有一个属性叫 a,且 a 的值为 1

 

MongoDB 支持的数据类型

Object ID: 对象 id
"_id" : ObjectId("5b151f8536409809ab2e6b26")

#"5b151f85" 代指的是时间戳, 这条数据的产生时间
#
"364098" 代指某台机器的机器码, 存储这条数据时的机器编号
#
"09ab" 代指进程 ID, 多进程存储数据的时候, 非常有用的
#
"2e6b26" 代指计数器, 这里要注意的是, 计数器的数字可能会出现重复, 不是唯一的
#
以上四种标识符拼凑成世界上唯一的 ObjectID
#
只要是支持 MongoDB 的语言, 都会有一个或多个方法, 对 ObjectID 进行转换
#
可以得到以上四种信息

#注意: 这个类型是不可以被 JSON 序列化的

String: 字符串,必须是 utf
-8
db.table01.insertOne({
"name": "sath"})

Boolean:布尔值,true 或者 false ( 这里有坑哦 ~在我们 Python 中 True False 首字母大写 )
db.teble01.insertOne({
"status": true})

Integer:整数 (Int32 Int64 你们就知道有个 Int 就行了 , 一般我们用 Int32)
db.table01.insert({"age":parseInt("100")}) # 字符串会被转成 int32

Double:浮点数 (没有 float 类型, 所有小数都是 Double)
默认是添加的所有的数数字都是 Double

Arrays:数组或者列表,多个值存储到一个键 (list 哦, 大 Python 中的 List 哦)
db.table01.insert({"hobby":["python","go", "java"]})

Object:如果你学过 Python 的话, 那么这个概念特别好理解, 就是 Python 中的字典, 这个数据类型就是字典
db.table01.insert({"1": {"name":"sath", "age":35}})

Null:空数据类型 , 一个特殊的概念,None Null
db.table01.insert({"is_null": null})

Timestamp:时间戳
db.table01.insert({"t_time":new Date().valueOf()})

Date:存储当前日期或时间 unix 时间格式 (我们一般不用这个 Date 类型, 时间戳可以秒杀一切时间类型)
db.table01.insert({"t_time":Date()})
Mon Dec
24 2018 19:23:34 GMT+0800

db.table01.insert({"t_time":new Date()})
2018/12/24 下午 19:23:19

 

MongoDB 常用语法

1. db.table01.insert({"name":"wangjianwei", "age":22})    # 官方不推荐
# 官方推荐以下两种方式
2. 插入一条数据 
db.insertOne({"name":"zhangsan", "age":78})    # 会返回添加进去的对象
    {
        "acknowledged" : true,
        "insertedId" : ObjectId("5c2091e508d12e25ff01af8d") }
3. 插入多条数据
db.table01.insertMany([{"name":"zhangsan", "age":78},{"name":"lisi", "age":36}])
    {
        "acknowledged" : true,
        "insertedIds" : [
                ObjectId("5c20924e08d12e25ff01af8e"),
                ObjectId("5c20924e08d12e25ff01af8f")]}

 

1. 删除所有
db.table01.remove({})

官方推荐写法
2. 删除一个
db.table01.deleteOne({
"hobby":{$all:["抽烟"]}})

3. 删除所有匹配到的
db.table01.deleteMany({
"hobby":{$all:["抽烟"]}})

4. 删除表
db.table01.drop()

 

改
语法格式:
db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
query : update 的查询条件
update : 要更新的内容
upsert : 可选,这个参数的意思是,如果不存在当前更新的记录,是否插入你要更新的值到数据中,默认是 false,不插入。
multi : 可选,mongodb 默认是 false, 只更新找到的第一条记录,如果这个参数为 true, 就把按条件查出来多条记录全部更新。
writeConcern : 可选,抛出异常的级别。

官方推荐的写法
更新第一条数据
db.table01.updateOne({"age":{$gt:70}}, {$set:{"age":0}})

更新所有的数据
db.table01.updateMany({"age":{$gt:70}}, {$set:{"age":0}})

 

1. 查询所有
db.table01.find()

2. db.table01.find().pretty() # 当查询到的结果可读性更高

3. 根据条件查询
db.table01.find({
"age":78}) # find 后面可以跟条件

4. 多个条件之间使用 and 的关系
db.table01.find({
"age":78, "name": "wangwu"}) # 多个条件之间是 and 的关系

5. 多个条件之间使用 or 关系
db.table01.find({$
or:[{"age":78},{"name":"zhangsan"}]}
多个条件放在列表中, 每一个条件是一个字典

6. and 和 or 一块使用
db.table01.find({
"addr":"ShangHai",$or:[{"name":"sath"},{"age": 88}]})

7. in 条件查询
db.table01.find({
"name": {$in: ["zhangsan", "sath"]}})
name 的值在某个列表中

8. 比较大小的方法
8.1 大于
db.table01.find({
"age": {$gt: 60}})
8.2 大于等于
db.table01.find({
"age": {$gte: 53}})
8.3 小于
db.table01.find({
"age": {$lt: 53}})
8.4 小于等于
db.table01.find({
"age": {$lte: 36}})
8.5 不等于
db.table01.find({
"age": {$ne: 53}})
8.6 等于
db.table01.find({
"age": {$eq: 53}})
db.table01.find({
"age":53})
8.7

9.
db.table01.find({
"hobby":{$all:["喝酒", "烫头"]}})
# all: 包含列表中所有的条件的
10.
db.table01.find({"name":"lisi"}, {"age":0})
# 过滤条件为 name=lisi, 后面的 age=0 表示查询的结果中
不要 age 的值,
# 使用 find 或者 findOne 都可以加这个条件, pymongo 也是一样


10. 模糊匹配

db.col.find({title: {"$regex": "59450"}})
db.col.find({title:/ 教 /}) # 模糊匹配
db.col.find({title:/^ 教 /}) # 匹配开头
db.col.find({title:/ 教 $/}) # 匹配末尾

 

 

备份与恢复

备份

保证数据库正在运行
mongodump -h 127.0.0.1 -o E:\db       # 备份所有的数据库
mongodump --collection table01 --db day120 -o E:\db2    # 备份指定数据库中的的指定集合 (表)

 

常用参数

-h:
MongDB 所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017

-d:
需要备份的数据库实例,例如:test

-o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在 dump 目录下建立一个 test 目录,这个目录里面存放该数据库实例的备份数据。

 

恢复

mongorestore  -h 127.0.0.1 E:\db

 

常用参数

--host <:port>, -h <:port>:
MongoDB 所在服务器地址,默认为: localhost:27017

--db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如 test2

--drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!

<path>
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。

你不能同时指定 <path> 和 --dir 选项,--dir 也可以设置备份目录。

--dir:
指定备份的目录

你不能同时指定 <path> 和 --dir 选项。

 

 

 

参考:  http://www.runoob.com/mongodb/mongodb-intro.html