TOC

Mongodb

    MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组,它是一种非关系的数据库Nosql。
    那么非关系带来的一个问题就是,耗存储空间,就比如10000条数据,每条数据都有一条是一样的,那么在关系型数据库的情况下,我们就可以直接使用外键的方式来进行存储,那么对于mongodb这样的非关系型数据库就需要每一条数据都进行存储,带来一定的资源浪费;
    在关系型数据库下,扩展性比较差,如果我们开始定义了一些数据,后期想要改起来非常麻烦,而且在大数据下IO比较大,因为我们要查询一条数据出来可能需要连很多表才能把这个数据给完整展现出来。那对Mongodb来说,它解决这个问题就非常简单,因为它是菲关系的,数据和数据之间没有任何关联,不涉及到连表查询,同时打来的好处就是速度快,灵活性比较好,不需要预先为表做字段,直接插即可;

Mongodb优势

易扩展性:NoSQL数据库种类繁多,但是一个共同的特点就是去掉关系型数据库的关系特性,数据之间无关系,这样就非常易于扩展;
性能高:在大数据量的情况下表现优秀,NoSQL数据库都具有非常搞的读写性能,尤其是在大数据量下,这得益于它的无关系性,数据库结构简单;
灵活性:NoSQL无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式,而在关系型数据库里,增删字段是一见非常麻烦的事情;
基础命令
管理
    管理包含数据备份和恢复;
备份
mongodump -h dbHost -d dbName -o backupDir
恢复
mongorestore -h dbHost -d dbName --dir backupDir
数据库命令
show dbs:查看库;
use:切换数据库;
db:查看当前数据库;
db.dropDatabase():删除当前数据库;
集合命令
show collections:查看当前数据库的所有集合;
db.集合名称.drop():删除集合;
db.createCollection("cce"):创建一个集合;
存储的数据
Object ID:文档ID;
    每个文档都有一个_id,保证文档的唯一性,如果没有显示定义,那么mongodb会自动生成;
Sting:字符串,必须是有效的utf8;
Boolean:存储一个布尔类型,true或false;
Integer:整形可以是32位或者64位;
Double:存储浮点数;
Arrays:数组或者列表,多个值存储到一个文档;
Object:用于嵌入式的文档,即一个值为一个文档;
Null:存储null值;
Timestamp:时间戳;
Date:存储当前时间或者时间的unix格式;
    创建日期的语句:new Date('2018-01-15') # 需要传入一个时间;
数据查询
db.集合名称.find():查找指定的数据,如果没有给定查询条件,默认查询所有, db.caichangen.find({"age":18})这是一个给定条件的示例;
数据增加
db.caichangen.insert({"name":"cce","age":18}) # 增加一条数据{"name":"cce","age":18}) # 如果数据已存在那么会抛出错误;
db.caichangen.save({"name":"cce","age":18}) # 增加一条数据{"name":"cce","age":18}) # 如果已存在就更新,如果不存在那么就插入;
数据更新
语法:db.集合名称.update(<query>,<update>,{multi:<boolean>})
更新一条数据:db.caichangen.update({},{age:30}) | db.caichangen.update({},{$set:{age:30}})
条件更新:db.caichangen.update({age:20},{age:30})
批量更新:db.caichangen.update({age:20},{$set:{age:30}},{multi:true})
数据删除
语法:db.集合名称.remove(<query>,{justOne:<Boolean>})
    query:查询条件;
    justOne:布尔值,为true删除一条,默认false删除所有数据;
删除匹配条件的所有:db.caichangen.remove({age:30},{justOne:false})
高级查询
find:查询,可以在后面加上pretty()将结果格式化;
findOne:查询,返回第一个集合,可以在后面加上pretty()将结果格式化;
比较运算符
等于:默认是等于判断,没有运算符;
$lt:小于;
$lte:小于等于;
$gt:大于;
$gte:大于等于;
$ne:不等于;

语法:db.caichangen.find({age:{$lt:18}})
范围运算符
$in:是否在某个范围内;
$nin:是否在某个范围内;

语法:db.caichangen.find({age:{$in:[18,19]}})
或者
 and:并且;
 $or:值为数组,数组中每个元素为json;
    语法:db.caichangen.find({$or:[{age:18},{name:"cce"}]})
 查询姓名为cce或者cfj并且年龄是18的:db.caichangen.find({$or:[{name:"cfj"},{name:"cce"}],age:18})
正则表达式
    使用//或者$regex编写正则表达式;
语法:
    db.caichangen.find({name:/^c/})
    db.caichangen.find({name:{$regex:'e$'}})
常用方法
limit:限制返回指定数量的文档;
    db.caichangen.find().limit(Number)
skip:用于跳过指定数量的文档;
    db.caichangen.find().skip(Number)
同时使用:
    db.caichangen.find().limit(Number).skip(Number)
自定义查询
    使用$where后面写一个函数,返回满足条件的数据;
示例:
    db.caichangen.find({$where:function(){return this.age>30;}})
返回指定的字段
语法:db.集合名称.find({},{字段:0/1}) # 0不显示,1显示;
示例:
    db.caichangen.find({name:{$regex:'e$'}},{age:1,_id:0})
排序
sort:sort可以在返回结果集后进行排除处理,传入一个1或者-1,1升序,-1降序;
示例:
    db.caichangen.find().sort({age:1})
统计
count:可以对结果集进行统计,也可以直接统计集合;
示例:
    db.caichangen.find().count()
    db.caichangen.count({age:{$gt:20}})
去重
distinct:可以对结果集进行去重;
语法:
    db.集合名称.distinct('去重字段':{条件})
示例:
    db.stu.distinct('age':{age:{$gt:18}})
索引
    建立索引提升查询速度,默认情况下mongodb会自动将_id字段设置为索引;
创建索引
单利索引
测试:插入10万条数据到数据库中
    for(var i=0;i<100000;i++){db.caichangen.insert({name:"cce"+i,age:i})}
测试:
    db.caichangen.find({'name':'cce10000'}) # 测试查询
    db.caichangen.find({'name':'cce10000'}).explain('executionStats') # 查看上面查询语句的执行状态信息,executionTimeMillis是查询时间;
创建索引:
    语法:db.集合名称.ensureIndex({属性:1/-1}) # 1表示升序,-1表示降序,-1的使用场景是经常使用sort来操作数据;
    示例:db.caichangen.ensureIndex({name:1})
联合索引
语法:db.集合名称.ensureIndex({属性:1/-1,属性:1/-1})
删除索引
语法:db.集合名称.dropIndex('索引名称')
查看索引
语法:db.集合名称.getIndexs()

Python操作Mongodb

    安装:pip install pymongo
from pymongo import MongoClient

client = MongoClient(host='192.168.1.254', port=27017)  # 初始化一个client对象,拿到一个连接初始化信息

collection = client['cce']['caichangen']  # 指定要连接的库和集合
# 清空数据库
collection.drop()
# 插入单条数据
date = {"_id": 1, "name": "cce0", "age": 100}
collection.insert(date)
# 插入多条数据
data_many=[{"name": "name" + str(1000+i), 'age': i} for i in range(10)] # 创建数据
collection.insert_many(data_many) # 多条插入
# 查询所有数据
result=collection.find({'name':'cce0'}) # 返回一个游标对象,它是一个可迭代对象,当游标走到最后的时候那么就获取不到数据了,和我们的生成器一样;
for i in result:
    print(i)
# 查询一条数据
result=collection.find_one({'name':'cce0'})
print(i)
# 更新一条数据
collection.update_one({'name':'cce0'},{"$set":{'name':'caichangen'}})
# 更新所有数据
collection.update_many({'name':'cce0'},{"$set":{'name':'caichangen'}})
连接副本集
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Time    : 2020/5/23 23:07
# @Author  : CaiChangEn
# @Email   : mail0426@163.com
# @Site    : https://blog.doorta.com
# @Software: PyCharm
from pymongo import MongoClient

client = MongoClient(['172.16.1.1:27017','172.16.1.2:27017','172.16.1.3:27017'])
collection = client['cce']['students']
print(collection.find_one())

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注