MongoDB

Posted harryblog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。

一 MongoDB的简介

1 MongoDB是什么

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的
它和我们使用的关系型数据库最大的区别就是约束性,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
关系型数据库中有一个 "表" 的概念,有 "字段" 的概念,有 "数据条目" 的概念
MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦

2 MongoDB数据存储格式

JSON格式
  JSON 数据格式与语言无关,脱胎于 javascript,但目前很多编程语言都支持 JSON 格式数据的生成和解析。JSON 的官方 MIME 类型是 application/json,文件扩展名是 .json。
  MongoDB 使用JSON(JavaScript ObjectNotation)文档存储记录。JSON数据库语句可以容易被解析。

BSON格式
SON是由10gen开发的一个数据格式,目前主要用于MongoDB中,是MongoDB的数据存储格式。BSON基于JSON格式,选择JSON进行改造的原因主要是JSON的通用性及JSON的schemaless的特性。
  二进制的JSON,JSON文档的二进制编码存储格式
  BSON有JSON没有的Date和BinData
  MongoDB中document以BSON形式存放
       db.meeting.insert(meeting:“M1 June",Date:"2018-01-06");

 3 MongoDB适用场景

网站数据、缓存等大尺寸、低价值的数据
在高伸缩性的场景,用于对象及JSON数据的存储。

4 与关系型数据库的概念映射

表           table         Collection
字段       Colum       Fields
行           Row          Documents

 

二 MongoDB安装与部署

 1 安装

MongoDB官网:https://www.mongodb.com/
CentOS7.X版本软件下载地址https://www.mongodb.org/dl/linux/x86_64-rhel7
在root用户下操作 # 该方法仅限与CentOS系统使用

cat >> /etc/rc.local <<EOF
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
EOF

Transparent Huge Pages (THP),通过使用更大的内存页面,可以减少具有大量内存的机器上的缓冲区(TLB)查找的开销。
但是,数据库工作负载通常对THP表现不佳,因为它们往往具有稀疏而不是连续的内存访问模式。您应该在Linux机器上禁用THP,以确保MongoDB的最佳性能。

创建用户

groupadd -g 800 mongod
useradd  -u 801 -g mongod  mongod    

修改用户密码

echo 123456 |passwd --stdin  mongod

创建程序目录

mkdir -p /application/mongodb/   &&cd  /application/mongodb/   &&mkdir  -p  bin  conf  log  data

下载程序

cd  /application/mongodb/
wget http://downloads.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.2.8.tgz

解压程序

tar xf  mongodb-linux-x86_64-3.2.8.tgz
cd mongodb-linux-x86_64-3.2.8/bin/ &&cp * /mongodb/bin

修改程序属主

chown -R mongod:mongod /application/mongodb

切换到mongod用户,设置用户环境变量

su - mongod
cat >> .bash_profile <<EOF
export PATH=/mongodb/bin:$PATH
EOF
source .bashprofile

2 管理MongoDB

启动:mongod --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork
关闭:mongod --shutdown  --dbpath=/application/mongodb/data --logpath=/application/mongodb/log/mongodb.log --port=27017 --logappend --fork

3 登录数据库

[[email protected] ~]$ mongo
MongoDB shell version: 3.2.8
connecting to: test
>

4 使用配置文件的方式管理数据库

cd /application/mongodb/conf/
[[email protected] conf]$ vim mongod1.conf 
dbpath=/application/mongodb/data
logpath=/application/mongodb/log/mongodb.log
port=27017
logappend=1
fork=1
使用配置文件时的启动与关闭:
  启动:mongod -f mongod1.conf 
  关闭:mongod -f mongod1.conf  --shutdown

三 MongoDB的基本操作

Mongodb中关键字种类:

db(数据库实例级别)
  db本身
    db.connection 数据库下的集合信息
      db.collection.xxx(
rs(复制集级别)
sh(分片级别)

1 查询操作

在客户端指定数据库进行连接:

[[email protected] ~]$ mongo 10.0.0.152/admin
MongoDB shell version: 3.2.8
connecting to: 10.0.0.152/admin
> db
admin

查看当前数据库版本

> db.version()
3.2.8

切换数据库

> use test;
switched to db test

显示当前数据库

> db
test
> db.getName()
test

查询所有数据库

> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> show databases;
clsn   0.000GB
local  0.000GB
test   0.000GB

查看clsn数据库当前状态

> use clsn;
> db.stats()

    "db" : "clsn",
    "collections" : 1,
    "objects" : 10000,
    "avgObjSize" : 80,
    "dataSize" : 800000,
    "storageSize" : 258048,
    "numExtents" : 0,
    "indexes" : 1,
    "indexSize" : 94208,
    "ok" : 1

查看当前数据库的连接机器地址

> db.getMongo()
connection to 127.0.0.1

2 数据库管理

创建数据库

当use的时候,系统就会自动创建一个数据库。如果use之后没有创建任何集合。系统就会删除这个数据库。
> use clsn;

删除数据库

> show dbs;
clsn   0.000GB
local  0.000GB
test   0.000GB
> use clsn 
switched to db clsn
> db.dropDatabase()
 "dropped" : "clsn", "ok" : 1 

3 创建集合

方式一:

> use clsn;
switched to db clsn
> db.createCollection(a)
 "ok" : 1 
> db.createCollection(b)
 "ok" : 1 
查看当前数据下的所有集合
> show collections;
a
b
> db.getCollectionNames()
[ "a", "b" ]

方式二:

当插入一个文档的时候,一个集合就会自动创建。
> use clsn;
switched to db clsn
> db.c.insert(name:clsn);
WriteResult( "nInserted" : 1 )
> db.c.insert(url:http://blog.nmtui.com);
WriteResult( "nInserted" : 1 )

查看集合里的内容
> db.c.find()
 "_id" : ObjectId("5a4cbcea83ec78b7bea904f8"), "name" : "clsn" 
 "_id" : ObjectId("5a4cbcfc83ec78b7bea904f9"), "url" : "http://blog.nmtui.com" 

4 添加数据

db.tablename.insert(key:value)
官方推荐的写法:
#在图形化客户端和数据库中是这个写法
db.table.insertOne(key:value)
db.table.insertMany(k1:v1,k2:v2,,k3:v3)
#在pycharm中的写法为
db.tablename.insert_one()
db.tablename.insert_many(,,)

5 删除数据

db.tablename.remove(k:v)
db.tablename.remove(age:34) #删除所有age=34的数据
 
官方推荐的写法:
#数据库和图形化操作写法
db.tablename.deleteOne()  #删除符合条件的第一条数据
db.tablename.deleteMany() # 删除符合条件的所有数据

#在pycharm中的写法为
db.tablename.delete_one()
db.tablename.delete_many(,,)

6 更新数据

#查询出name为xx的数据,将符合条件的一条数据进行修改
db.tablename.update(name:xx,$set:age:23)
$set -set修改器   强制替换覆盖
官方推荐写法 #数据库和图形化操作的写法  #更新符合条件的第一条数据,第一条数据就是你第一个插入的数据
db.tablename.update_many(,) array(数组,列表) + object(字典) :db.tablename.updateOne(cp.name:装X,$set:cp.$.score:100) #此处cp.$.score,$的意思为前面查询出的索引

7 查询操作

db.filename.find()  #查询所有数据
db.user.find(name:xixi) #查询出name为xixi的数据
#查询符合条件的一条数据
db.tablename.findOne(k:v)

四 MongoDB的数据类型

ObjectId :Documents 自动生成的 _id
_id:ObjectId("5cb69a23815ea7295f8bad43") 自动生成的 json数据中不包含ObjectId类型 id类型uuid
String: 字符串,必须是utf-8
Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
Double:浮点数 (没有float类型,所有小数都是Double)
Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
Object:深度<=4 如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
Null:空数据类型 , 一个特殊的概念,None Null
Timestamp:时间戳 通常不用这个数据类型 如果存储时间 Double
Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)

五 查询关键字

array数据类型会自动遍历
$in 或者等于相同字段 db.filename.fiind(age:$in:[19,109])         #就是age=19或age=109的数据 
$or 或者等于不同字段 db.filename.find($or:[age:19,age:109] )    #也是age=19或age=109的数据,与$in不同之处在于 ,$in写的必须是相同的字段,而$or可以写不同的字段
$and or 逗号  -- 并列条件
$all --Array 数据类型 子集查询 db.filename.find(hobby:$all : [ cs,harry ])

六 修改器

数学比较:

$lt : 小于 √
$lte: 小于等于 √
$gt : 大于 √
$gte: 大于等于 √ 
$ne : 不等于
$eq or 冒号 : 等于

$set -- set修改器   强制替换覆盖

db.user.updateOne(name:"harry",$set:name:"cs")

$unset  -- 强制删除字段

db.user.updateOne(name:"harry",$unset:gender:0)

$inc    -- 引用增加   #就相当于我查询出的数据进行增加,没有减,如果想实现减的操作,加负的即可

db.user.updateOne(name:"harry",$inc:age:1) # 年龄加1

 array操作:

$push  相当于append  在array中追加

db.user.updateOne(name:"harry",$push:hobby:"养生")  # 添加一个元素
db.user.updateOne(name:"harry". hobby:"养生",$set:"hobby.$":"健身养生")  # 把养生修改成健身养生  $:满足前置条件列表元素的下标索引

$pushAll    相当于extend  在array中追加列表中的所有元素

db.user.updateOne(name:"harry",$pushAll :hobby:["养生", "健身"])

$pull       相当于remove  在array中删除一个元素

db.user.updateOne(name:"harry",$pull:hobby:"游戏") 

$pullAll    在array中删除一堆元素

$pop  相当于pop 删除第一个 -1 或 最后一个 1 的值

$pop:myczdyy:-1 在myczdyy中删除第一个元素
$pop:myczdyy:1 在myczdyy中删除最后一个元素

混搭用法示例:

db.user.updateOne(name:cs,$set:course:[
    course_name:"Python", score:101,
    course_name:"Vue.js", score:2,
    course_name:"mysql", score:98
])

db.user.updateOne(name:"cs", "course.course_name":"Vue.js", $inc:"course.$.score":10) # 把VUE的成绩+10

 七 sort(排序) skip(跳过) limit(选取条目)

sort 排序

#找到name为xixi的数据,根据age排序
db.filename.find(name:xixi).sort(age:18)
 
#找到name为xixi的数据,根据age排序,如果age有相同的,再根据birthday倒序排序
db.filename.find(name:xixi).sort(age:18,birthday:-1)

skip 跳过

#找到name为xixi的数据,然后根据插入顺序跳过第一条
db.filename.find(name:xixi).skip(1)

limit 选取条目

#找到name为xixi的数据,根据插入顺序选取出3条数据展示
db.filename.find(name:xixi).limit(3)

sort,limit,skip是有执行顺序的
先排序(sort),在跳过(skip),最后显示条目(limit)

实现分页:

(page-1)*num
db.filename.find(name:xixi).skip((page-1)*num).limit(num)

八 pymongo

安装 pip install  pymongo

# 创建客户端

mongo_client = pymongo.MongoClient(host="127.0.0.1", port=27017)
mongo_db = mongo_client[my_mongo_db]

# 查询数据

res = mongo_db.user.find() # cursor对象 可被迭代
for i in res:
    print(i)

# 查询单条数据

res = mongo_db.user.find_one()

# 带条件查询

res = mongo_db.user.find_one("name":"cs")

# 插入数据

res = mongo_db.user.insert_one("name":"harry")
res = mongo_db.chat.insert_one()

# 插入多条

res = mongo_db.user.insert_many([name:harry, name:sam, name:jerry])

# 修改数据

res = mongo_db.user.update_one("name":"jerry","$set":"age":999)  # 返回UpdateResult对象

# 修改多条

res = mongo_db.user.update_many("age":"$gte":0, "$set":"age":888

# 删除

res = mongo_db.user.delete_one("name":"sam") # 删除一条数据

 

以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章

MongoDBMongodb——GridFS存储

mongoDBmongoDB副本集实战

MongoDBMongoDb数据结构

MongoDBmongodb设置用户访问权限

MongodbMongodb复制和分片

MongoDBMongoDB的安装教程