mongodb的基础使用。
NoSQL简介:
概述:
NoSQL,全名为 not only sql ,指的是非关系型的数据库随着访问量的上升,网站的数据库性能出现了问题,于是nosql被设计出来
优点:
高可扩展性
分布式计算
低成本
架构的灵活性,半结构化数据
没有复杂的关系
缺点:
没有标准化
有限的查询功能
最终一致是不直观的程序
一、MongoDB:
什么是MongoDB?
- MongoDB是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统,在高负载的情况下,可以添加更多结点,可以保证服务器的性能。
- MongoDB为web应用提供了高性能的数据存储解决方案。
- MongoDB将数据存储为一个文档,数据结构由(key->value)形式组成,MongoDB文档类似于json文件,字段值可以是其他文档,列表等。
- JSON文件:
存储数据的一种格式,
{} :代表字典
[] :列表
, :数据分隔
: :键值对
- 特点:
- MongoDB提供了一个面向文档存储,基本思路是将原来的“行”的概念转换成了更加灵活的“文档”模型,一条记录可以表示非常复杂的层次关系。
- MongoDB支持丰富的查询表达式,查询指令是json形式的标记,可以轻易查询文档中嵌套的对象和列表。
- 非常容易扩展,扩展集群后还可以实现集群中数据的负载均衡。
- MongoDB支持各种编程语言,比如 python、 java、 c++ 、php、C#、ruby、JavaScript等
- 丰富的功能,包括索引、存储JavaScript、聚合、固定集合、文件存储等功能
- MongoDB的一些概念
- 与mysql术语的对比:
- database -> database 数据库
- table -> collection 数据库表/集合
- row -> document
- column -> field
- index -> index
- table joins -> null
- primary key -> primary key
- 与mysql数据结构的对比
- 数据库
- 一个MongoDB中可以建立多个数据库
- MongoDB的单个实例可以容纳多个数据库,每一个都有自己的集合和权限,不同的数据库放在不同的文件中。(一般一个数据库就是一个文件)
- 数据库通过名字来标识,
-
- 不能是空字符串
- 不能含有:引号,空格,点,$ ,/ ,\ ,\0
- 全部小写
- 最多64字节
-
- 有一些数据库名是保留的,可以直接访问
-
- admin
-
从权限的角度考虑,这是“root”数据库,要是讲一个用户添加到这个数据库,这个用户自动继承所有数据库的权限,一些特定的数据库服务端的命令只能从这个数据库运行,比如:列出所有的数据库,关闭服务。
-
-
-
- local
-
-
这个数据库永远不会被复制,用来存储限于本地单台服务器的一些集合。
-
-
-
- config
-
-
当MongoDB用于分片设置时,config数据库在内部使用用于保存分片的相关数据。
- 文档
- 概念:
文档是MongoDB中最核心的概念,是其核心单元,将文档类比成关系型数据库中的每一行数据
多个键及其关联的值 有序 的放在一起就是文档,MongoDB使用了Bson数据结构来存储数据和网络数据交换。
Bson数据可以理解为在JSON的基础上添加了一些json没有的数据类型
-
- 例子:
-
- 文档的命名规范:
-
- 键不能含有\0,$,
- 以下划线开头的键都是保留的。
-
- 注意事项:
-
- 文档中的键值对是有序的
- 文档中的值可以是列举的数据类型的值,甚至是另一个文档
- MongoDB区分大小写和类型
- 文档中的键不能重复
- 文档中的键一般是字符串
-
- 文档的命名规范:
- 集合
类比mysql中的表,集合是就是一组文档的组合
在MongoDB中集合是无模式的,也就是说集合中存储的文档的集合可以不同。
注意:当第一个文档插入时,集合就会被自动创建。
- 命名规则:
- 集合名不能是字符串
- 不能含有:引号,空格,点,$ ,/ ,\ ,\0
- 不能以system. 开头,这是为系统集合保留的前缀
- 集合的名字不能含有保留字符
- mongodb操作数据库
- 创建数据库
格式: use 数据库名
注意:如果不存在,则创建数据库,否则切换到指定数据库
- 查看所有数据库
格式:show dbs
注意:如果刚刚创建的数据库不再列表内,并不代表没有创建,而是因为数据中没有数据而不显示。如果要显示需要给数据库中插入一些数据。
- 查看当前使用的数据库
格式:db 或者 db.getName()
- 删除数据库
说明:当前正在使用哪个数据库则删除哪个数据库,db代表当前正在使用的数据库。
格式:db.dropDatebase()
- 断开链接
exit
- 查看API
help
- 操作集合
- 查看当前数据库下的所有集合
show collections
- 创建集合
-
-
- db.createCollection(“集合名”)
- db.集合名称.insert(文档)
-
-
区别:第一种,创建一个空集合。第二种方法创建一个空集合后并向集合中添加一个文档。
- 删除集合
db.集合名称.drop()
- 操作文档
- 增
-
-
- insert()
-
-
db.集合名称.insert(文档)
添加一个:db.student.insert({“name”:”tom1”,”age”:”18”})
添加多个:db.student.insert(
[
{“name”:”tom2”,”age”:”18”},{“name”:”tom1”,”age”:”18”},
{“name”:”tom3”,”age”:”18”}]
)
-
-
-
- save()
-
-
db.集合名称.save(文档)
注意:如果不指定_id字段save()方法类似于insert()字段,如果指定_id字段,则会更新改_id字段的数据库。
-
-
- 删
-
-
- remove()
-
-
db.集合名称.remove(
<query>,
{
justOne:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:可选,删除的文档的条件
justOne:可选,如果为true,则只删除一条,如果为flase 则删除所有匹配的。
writeConcern:可选,抛出异常的级别
- 改
-
-
- update():用于更新已经存在的文档
-
-
db.集合名称.update(
<query>,
<update>,
{
upser:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
query: update 的查询条件,类似mysql中update后面的where后面的条件语句。
update:
一些更新的操作,$set表示设置、$inc表示叠加
upset:可选参数,如果不存在update的记录,是否插入该数据,true为插入,默认为flase不插入
multi:可选,默认为false,只更新找到的第一条数据,如果为true,则更新所有匹配的文档
writeConcern:可选,抛出异常的级别
-
-
-
- save():通过传入的文档替换已有的文档
-
-
db.集合名称.save(
<document>,
{
writeConcern:<document>
}
)
- 查
-
-
- 查询文档
-
-
find()
db.集合名称.find()
查询集合中的所有文档数据。
db.集合名称.find(
{
queryWhere
},
{
key1:1/0,
key2:1/0,
……
}
)
参数说明:
queryWhere:查询条件
key: 要显示的字段,1表示显示
pretty()
以格式化的方式来显示文档。
db.student.find().pretty()
findOne()
匹配结构的第一条数据
db.student.findOne()
-
-
-
- 查询条件操作符
-
-
db.集合名称.find({key:{操作符:值}})
> $gt
>= $gte
< $lt
<= $lte
db.student.find({age:{$gt:30}})
联合使用 >= 与<=
db.student.find({age:{$gte:30,$lte:50}})
== 直接:
使用_id进行查询
db.集合名称.find({“_id”:ObjectId(“id值”)})
查询某个结果集的数据条数
db.student.find({age:{$gte:30,$lte:50}}).count()
查询某个字段中是否包含另一个值。
db.集合名称.find({key:/value/})
db.student.find({key:/aaa/})
查询某个字段是否以另一个值开头
db.集合名称.find({key:/^value/})
db.student.find({key:/^tom/})
-
-
-
- 查询条件and和or
-
-
and:
- find()中出入多个键,每个键以逗号隔开
db.student.find({name:”tom3”,age:7})
or:
db.集合名称.find(
{$or:[
{key1:value1},
{key2:value2},
……
]
}
)
db.student.find({$or:[{age:20},{age:30}]})
and与or联合使用:
db.集合名称.find(
{
key1:value1,
key2:value2,
$or:[
{key1:value1},
{key2:value2},
]
}
)
-
-
-
- limit和skip
-
-
limit():读取指定数量的记录
db.student.find().limit(5)
skip():跳过指定数量的数据
db.student.find().skip(5)
分页的实现,
-
-
-
- 排序
-
-
db.集合名称.find().sort({key:1})
参数key:排序的字段 后边值为1以升序排列 -1表示降序。
- 代码操作MongoDB
pip install pymongo(哪里写代码 哪里写)
- 增
from pymongo import MongoClient conn = MongoClient("xuaman.top",27017)#连接到我们要连接的远程服务器 db = conn.student#得到数据库操作对象 collection = db.student#得到集合的操作对象 collection.insert( [{"name":"xiaoha2","age":"18"}, {"name": "xiaoha3", "age": "26"}, {"name": "xiaoha3", "age": "27"}, {"name": "xiaoha4", "age": "33"}, {"name": "xiaoha5", "age": "62"}, {"name":"xiaoha6","age":"57"}, {"name":"xiaoha7","age":"41"}, {"name": "xiaoha8", "age": "18"}, {"name": "xiaoha9", "age": "26"}, {"name":"xiaoha10","age":"25"}, {"name":"xiaoha11","age":"35"} ] ) conn.close()
- 删
from pymongo import MongoClient
#链接服务器
conn = MongoClient("xuaman.top", 27017)
#链接数据库
db = conn.axf
#获取集合
collection = db.student
collection.remove({"name":"lilei"})
#断开链接
conn.close()
- 改
from pymongo import MongoClient
#链接服务器
conn = MongoClient("xuaman.top", 27017)
#链接数据库
db = conn.axf
#获取集合
collection = db.student
collection.update({"name":"lilei"},{"$set":{"age":20}})
#断开链接
conn.close() - 查
from pymongo import MongoClient
import pymongo
from bson.objectid import ObjectId
#链接服务器
conn = MongoClient(“xuaman.top”", 27017)
#链接数据库
db = conn.axf
#获取集合
collection = db.student
# 查询所有
# res = collection.find()
# print(res)
# print(type(res))
# for stu in res:
# print(stu, type(stu))
#查询部分
# res = collection.find({"age":{"$gt":40}})
# for stu in res:
# print(stu)
#统计查询
# print(collection.find({"age":{"$gt":40}}).count())
#排序
# res = collection.find().sort("age", pymongo.DESCENDING)
# for stu in res:
# print(stu)
# 分页相关
# res = collection.find().limit(5)
# for stu in res:
# print(stu)
# _id查询
print(collection.find_one({"_id":ObjectId('5b865c3b8ad03c4c28e530ee')}))
#断开链接
conn.close()