MongoDB 是一个基于分布式存储的数据库,由 C++ 语言编写的NoSQL非关系数据库。非关系型数据库NoSQL,即Not Only SQL,意即“不仅仅是SQL”,通常指数据以对象的形式存储在数据库中,而对象之间的关系通过每个对象自身的属性来决定。
MongoDB的特点
MongoDB 数据库主要用于海量存储,常被用在数据采集项目中。数据存储不需要固定模式,不需要多余操作就可以横向扩展,低成本,没有复杂的关系,安装简单,支持各种编程语言等。
MongoDB和传统型数据库相比
传统型数据库: 结构化数据,定好了表结构后,每一行的内容,必是符合表结构的,就是说--列的个数,类型都一样。
MongoDB文档型数据库: MongoDB存储的对象是一个文档,数据结构是由键值对组成,类似于json对象,字段值可以包含其他文档、数组及文档组。
下边是mongodb与关系数据库的一些概念对比:
SQL | MongoDB |
---|---|
官方学习文档:https://docs.mongodb.com/manual/introduction/
windows下载安装包后,找到安装目录下的“mongo.exe”,运行并启动。
命令行下运行 MongoDB 服务器
在MongoDB所在盘下的根目录创建一个data文件夹,并在data文件夹里创建一个db文件夹。
cmd中,进入G:\mango\data 目录下,执行mongod --dbpath G:\mango\data,然后启动mongod.exe。
MongoDB的常用命令
常用数据库命令
#查看当前的数据库
db
#查看所有数据库
show dbs
#切换/创建数据库(不存在创建新数据库,存在切换数据库)
use database_name
#删除数据库
db.dropDatabase()
常用的集合命令
#创建集合
db.createCollection(name, options)
name: 新创建的集合名称 options: 创建参数
#查看集合
show tables
show collections
#删除集合
db.集合名称.drop()
常用的数据操作命令
插入数据
db.collection_name.insert(document)
#插入一条数据:
db.stu.insert({name:'zhangsan','age':20});
#插入一条数据,指定主键:
db.stu.insert({_id:3,'name':'lisi','age':28});
#增加多条数据:
db.stu.insert(
[{name:'wangyi','age':18},{'name':'sunwu','age':25}])
“ mongodb中文档的格式是json格式 文档中没有_id键值,系统会自动为文档添加。_id是一个特殊键值,该值在整个collection中是唯一的。 ”
删除数据 db.collection.remove(查询表达式, 选项justOne)
选项justOne : (可选)如果设为 true 或 1,则只删除一个文档,如果不设置该参数,或使用默认值 false,则删除所有匹配条件的文档。
#删除名字是zhangsan的记录
#db.stu.remove({name:"zhangsan"})
修改数据
db.collection.update(查询表达式,新值,选项) 选项: {upsert:true/false,multi:ture/false}
- upsert:默认为false, 作用:无相应记录是否insert,与mysql中的replace同
- multi:默认为false, 作用:是否作用于多条
#替换文档,将name为zhangsan的第一个文档替换为{"name":"lisi","age":10}
db.stu.update({"name":"zhangsan"},{"name":"lisi","age":10})
$set修改器,指定要更新的key,key不存在则创建,存在则更新。
#将name为zhangsan的所有文档替换为{"name":"lisi","no":'100'}
db.stu.update({"name":"zhangsan"},{$set:{"name":"lisi","no":'100'}},{multi:true})
查找数据
#查找所有数据
db.集合名.find()
# 查找到所有匹配数据
db.集合名.find({条件文档})
# 只返回匹配的第一个数据
db.stu.find({age:{$gt:16}}) #查询年龄大于16的记录
db.stu.find({$or:[{age:{$gt:18}},{name:"xiaoming"}]) #查询年龄大于18或者名字是xiaoming的记录
#使用$where后面写一个函数,返回满足条件的数据
db.stu.find({$where:function(){return this.age>20}})
#用于读取指定数量的文档
db.集合名称.find().limit(NUMBER)
#对查询结果排序(参数1升序,参数-1降序)
db.集合名称.find().sort({字段:1,...})
#统计结果中的文档数
db.集合名称.find({条件}).count()
mongodb与python的交互
用Python 操作 MongoDB 非常方便,无需定义表结构就可以直接将数据插入,使用pymongo模块,可以实现mongodb与python的交互。
pymongo库
pip install pymongo
1.连接mongodb
无需权限认证方式
import pymongo
myclient = pymongo.MongoClient("mongodb://localhost:27017")
# myclient = pymongo.MongoClient('localhost',27017)
print(myclient.list_database_names())
输出:
['admin', 'config', 'local', 'test']
权限认证方式
import pymongo
myclient = pymongo.MongoClient('localhost', 27017)
db = mongo_client.admin
db.authenticate('用户名', '密码')
2.指定数据库和集合
获取数据库
方法一:db = client.test
方法二:db = client['test']
指定集合
方法一:collection = db.stu
方法二:collection = db['stu']
3.插入数据
可以使用insert方法插入数据,但在pymongo中,官方推荐使用 insert_one 完成单个数据的写入,insert_many 完成多条数据的插入。
#增加一条
stu1={'id':'001','name':'zhangsan','age':10}
result = collection.insert_one(stu1)
#增加多条
stu2={'id':'002','name':'lisi','age':15}
stu3={'id':'003','name':'wangwu','age':20}
result = collection.insert_many([stu2,stu3])
4.删除数据
#可以直接使用remove方法删除指定的数据
result = collection.remove({'name': 'zhangsan'})
#使用delete_one()删除一条数据
result = collection.delete_one({"name":"zhangsan"})
#delete_many()删除多条数据
result = collection.delete_many({"age":{'$lt':20}})
5.修改数据
可以使用update方法修改数据,但在pymongo中,官方推荐使用 update_one 完成单个数据的修改,update_many 完成多条数据的修改。
#update_one,第 2 个参数需要使用$类型操作符作为字典的键名
#姓名为zhangsan的记录,age修改为22
condition = {'name': 'zhangsan'}
res = collection.find_one(condition)
res['age'] = 22
result = collection.update_one(condition, {'$set': res})
print(result) #返回结果是UpdateResult类型
print(result.matched_count,result.modified_count) #获得匹配的数据条数1、影响的数据条数1
#update_many,所有年龄为15的name修改为xixi
condition = {'age': 15}
res = collection.find_one(condition)
res['age'] = 30
result = collection.update_many(condition, {'$set':{'name':'xixi'}})
print(result) #返回结果是UpdateResult类型
print(result.matched_count,result.modified_count) #获得匹配的数据条数3、影响的数据条数3
6.查询数据
find()查找全部数据
返回所有满足条件的结果,如果条件为空,则返回全部结果,返回结果是一个Cursor游标可迭代对象。
rets = collection.find({"age":20}),
for ret in rets:
print(ret)
# 查询结果有多少条数据
count = collection.find().count()
# 查询结果按年龄升序排序
results = collection.find().sort('age', pymongo.ASCENDING)
print([result['age'] for result in results])
find_one()查找一条数据
接收一个字典形式的条件,返回字典形式的整条数据,如果条件为空,则返回第一条。
ret =collection.find_one({'name': 'zhangsan'})