MongoDB
简介
- MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
- 是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库中最像关系型数据库的一种,是功能最丰富的非关系型数据库。
安装及测试
-
安装:
-
双击安装包,然后一路NEXT即可完成安装
-
将安装目录添加系统环境变量PATH下
-
创建目录
c:\data\db # 存放数据 c:\data\log # 存放日志
-
-
启动连接
- 启动服务:
mongod --dbpath c:\data\db
- 客户端连接:
mongo
,默认地址:127.0.0.1:27017
- ubuntu下启动:
sudo service mongodb start
- ubuntu下关闭:
sudo service mongodb stop
- 启动服务:
-
将MongoDB添加到windows系统服务(需要以管理员身份运行终端)
- 添加服务:
mongod --dbpath "c:\data\db" --logpath "c:\data\log\MongoDB.log" --install --serviceName "MongoDB"
- 移除服务:
mongod --dbpath "c:\data\db" --logpath "c:\data\log\MongoDB.log" --remove --serviceName "MongoDB"
- 服务控制:
net start|stop MongoDB
- 添加服务:
MySQL与MongoDB对比
-
相关概念
MySQL MongoDB database(数据库) db(数据库) table(数据表) collection(集合) row(行) document(文档) column(列) field(域/字段)
db操作
- 查看所有数据库:
show dbs
,若数据库中没有数据,则不会显示出来 - 查看当前数据库:
db
或db.getName()
- 创建并切换数据库:
use python1806
- 数据库存在直接切换,不存在创建后再切换
- 当数据库中没有数据时,
show dbs
不会显示
- 删除当前数据库:
db.dropDatabase()
- 查看帮助:
help
- 退出:
exit
或quit()
collection操作
- 查看当前数据库下的所有集合:
show collections
- 创建集合:
- 单纯创建:
db.createCollections('user')
,会创建一个空集合 - 按需创建:
db.stu.insert({name:'shuorui', age:30})
,直接操作不存在的集合,系统会自动创建
- 单纯创建:
- 删除集合:
db.stu.drop()
document操作
-
增加文档:
- insert
# 插入一条数据 db.user.insert({name:'jiwei', age:29, height:175, isDelete:0}) # 插入多条数据 db.user.insert([{name:'zhihui',age:18, height:168, isDelete:0},{name:'minghui', age:28, height: 173, isDelete:0}])
- save
# 保存的数据没有_id字段,会插入一个新的文档 db.user.save({name:'wenke', age:40, height:178, isDelete:0}) # 保存的数据有_id字段,会修改对应的数据 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:30, height: 178, isDelete:0})
-
更新文档
- save
# 保存的数据有_id字段,会修改对应的数据,就相当于更新操作 db.user.save({_id:ObjectId("5be3ecf105c088a265a0b578"), name:'wenke',age:25, height: 178, isDelete:0})
- update:
db.集合.update(query, update, {upsert:<boolean>, multi:<boolean>})
- query:表示查询条件
- update:表示更新设置的内容
- $set:表示设置
- $inc:表示增加
- upsert:更新的查询结果不存在,是否作为新数据插入,默认为false
- multi:符合条件的数据是否全部更新;true表示全部更新,false表示更新一条,默认为false
db.user.update({age: 25}, {$set:{age:26}}) # 只会更新一条 db.user.update({height:175}, {$inc:{height: 1}}, {multi: true}) # 会更新全部
-
删除文档
- remove:
db.集合.remove(query,{justOne:<boolean>})
db.user.remove({height: 176}) # 默认删除所有数据 db.user.remove({isDelete:0}, {justOne:true}) # 只会删除一条数据
- delete:官方推荐
db.user.deleteOne({isDelete: 0}) # 删除一条数据 db.user.deleteMany({isDelete: 0}) # 删除所有数据
- remove:
-
查询文档
- 格式:
db.集合.find(query, {key1:0/1, key2:0/1, keyn:0/1})
- query:查询条件
- key:表示字段名
- 第二个参数要么同时为1表示显示的字段,要么同时为0表示排除的字段
db.user.find({},{name:1, age:1}).pretty() # 只显示name和age db.user.find({},{name:0, age:0}).pretty() # 不显示name和age
- pretty():格式化显示数据(类似于字典形式显示)
db.user.find().pretty()
- findOne
db.user.findOne({isDelete:0}) # 只返回条数据
- 格式:
查询条件操作符
- 大于:$gt
- 格式:
db.集合.find({<key>: {$gt: <value>}})
- 示例:
db.user.find({height: {$gt: 170}})
- 格式:
- 大于等于:$gte
- 小于:$lt
- 小于等于:$lte
- 等于:$eq,不写默认就是等于
- 不等于:$ne
- 多个条件:默认是并且的关系
db.user.find({height: {$gt: 165, $lt: 175}})
db.user.find({height: {$gt: 165}, age: {$gt:25}})
- 数据统计:
count()
,示例:db.user.find().count()
- 正则查找:
db.集合.find({<key: /正则表达式/>})
条件合并(and/or)
- and:表示并且
- 格式:
db.集合.find({条件1,条件2})
- 示例:
db.user.find({age: {$gt: 25}, isDelete: 0})
- 繁琐:
db.user.find({$and: [{age: {$gt: 25}}, {isDelete: 0}]})
- 格式:
- or:表示或者
- 格式:
db.集合.find({$or: [{条件1}, {条件2}]})
- 示例:
db.user.find({$or: [{height: {$gt: 170}},{age: {$lt: 25}}]})
- 格式:
限制结果集
- 限制数量:
limit()
- 示例:
db.user.find().limit(2)
- 示例:
- 跳过数量:
skip()
- 示例:
db.user.find().skip(2)
- 示例:
- 综合使用:
db.user.find().skip(2).limit(2)
结果集排序
- 格式:
db.集合.find().sort({<key>: 1/-1})
- key:表示排序的字段
- 1/-1表示排序规则:1表示升序,-1表示降序
- 示例:
db.user.find().sort({age: 1, height: 1})
- 可以指定多个排序字段,前面的值一样时,按照后面的字段排序
索引管理
- 说明:创建索引就是为了提高查询效率,1表示升序,-1表示降序,background表示后台执行
- 示例:
db.user.createIndex({age: 1},{background: true}) # 单独创建索引
db.user.createIndex({age: 1, height: -1},{background: true}) # 创建组合索引
- 使用:
db.user.find({age: {$gt: 20}})
,默认会按照age字段进行升序排序
Python操作MongoDB
- 安装扩展:
pip install pymongo
- 连接服务器:
from pymongo import MongoClient
# 创建连接
connect = MongoClient(host='127.0.0.1', port=27017)
# 选择数据库
# db = connect.test
db = connect['test']
# 打印当前库的名字
# print(db.name)
# 查看当前看中的所有集合名称
ret = db.collection_names()
print(ret)
# 关闭连接
connect.close()