一、什么是MongoDB?
1) MongoDB是有C++编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加多的节点,可以保证服务器性能。
2) MongoDB旨在为web应用提供可扩展的高性能数据存储解决方案。
3)MongoDB将数据存储为一个文档,数据结构由键值key->value对组成,MongoDB文档类型类似于json对象,字段值可以包含其他文档、数组及文档数组。
二、操作Mongo数据库
1. 使用/创建数据库:use 数据库名,如果数据库不存在则创建,否则切换至指定数据库。
==> 如果是新创建数据库后使用show dbs,发现创建的数据库不在列表内,则需要向数据库中插入一条数据后才能展示出来
2. 删除数据库:db.dropDatabase()
==> 前提:使用当前数据库
3. 查看所有数据:show dbs
4. 查看当前正在使用的数据库:1)db 2)db.getName()
5. 断开连接:exit
6. 查看命令api:help
三、集合操作
1. 查看当前数据库下有哪些集合:show collections
2. 创建集合
==> db.createCollection("集合名")
==> db.集合名.insert({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})
==> 区别:前者是创建一个空的集合,后者是创建一个空的集合并添加一个文档。
3. 删除当前数据库中的集合
==> db.集合名.drop()
四、文档操作(重点)
1. 插入文档
==> 使用insert()方法:db.集合名.insert(文档)
可以插入一条,也可以插入多条。db.集合名.insert([文档1, 文档2, 文档3, ...])
栗子:db.student.insert({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})
db.student.insert([{name:"yxj", age:18, gender:1, address:"四川", isDelete:false},{name:"yh", age:20, gender:0, address:"山西", isDelete:false}])
==> 使用save()方法:db.集合名.save(文档)
如果不指定_id字段,save()同insert(),如果指定_id字段,则会更新_id字段的数据
栗子:db.student.save({name:"yxj", age:18, gender:1, address:"四川", isDelete:false})
db.student.insert({_id:ObjectId("5f32658cad6df702d29bf9a3"), name:"yxj", age:18, gender:1, address:"四川", isDelete:false})
2. 更新文档
==> update()方法:
db.集合名.update(
query,
update,
{
upset:<boolean>,
multi:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:update的查询条件,类似于sql中的update语句内的where子句后的内容
update:update的对象和一些更新的操作符($set,$inc等)。$set:直接更新,$inc:在原有的基础上累加后更新
upset:可选,如果不存在update的记录,是否用作新数据插入进去,默认为false
multi:可选,只更新找到的第一条记录,默认为false,如果为true,则更新查找出来的所有数据
writeConcern:可选,抛出异常的级别
栗子:db.student.update({name:"yxj"},{$set:{age:3}})
⬇ ⬇
query update
==> save()方法
区别:update方法用于更新已存在的文档,save通过传入的文档替换已有文档(伪更新)
3. 删除文档
说明:在执行删除remove()方法前,先执行find()方法查找要删除的数据是否存在。
==> remove()方法:
db.集合名.remove(
query,
{
justOne:<boolean>,
writeConcern:<document>
}
)
参数说明:
query:可选,筛选要删除的文档的条件,不指定时,删除全部文档
justOne:可选,值为true/1时,只删除一个文档
栗子:db.student.remove({name:"yh"})
4. 查询文档
==> find()方法:db.集合名.find()
栗子:db.student.find()
==> find()方法查询指定列:
db.集合名.find(
query,
{
<key>:1,
<key>:1,
}
)
参数说明:
query:查询条件
key:要显示的字段,1表示显示
栗子:db.student.find({gender:0}, {name:1, age:1})
==> pretty()方法:以格式化的方式来显示文档
db.集合名.find().pretty()
==> findOne()方法:查询匹配结果的第一条数据
db.集合名.findOne()
5. 查询条件操作符
条件操作符用于比较两个表达式并从MongoDB集合中获取数据。
==> 大于操作:$gt
db.集合名.find({<key>:{$gt:<value>}})
栗子:db.student.find({age:{$gt:20}}) # 年龄>20
==> 大于等于操作:$gte
db.集合名.find({<key>:{$gte:<value>}})
==> 小于操作:$lt
db.集合名.find({<key>:{$lt:<value>}})
==> 小于等于操作:$lte
db.集合名.find({<key>:{$lte:<value>}})
==> 等于操作:
db.集合名.find({<key>:<value>})
==> 大于等于和小于等于:
db.集合名.find({<key>:{$gte:<value>, $lte:<value>}})
==> 使用_id进行查询:
db.集合名.find({"_id":ObjectId("id值")})
==> 查询某个结果集的数据条数:
db.集合名.find().count()
==> 查询某个字段的值当中是否包含另一个值:
db.集合名.find({name:/包含值/})
栗子:db.student.find({name: /xj/}) # 名字中包含xj的
==> 查询某个字段的值是否以另一个值开头:
db.集合名.find({name:/^包含值/})
栗子:db.student.find({name: /^y/}) # 名字以y开头的
6. 条件查询 and 和 or
==> and条件:
db.集合名.find({条件1, 条件2, 条件3, ... , 条件n})
栗子:db.student.find({gender:1, age:{$gt:18}}) # 性别为男,且年龄大于18的
==> or条件:
db.集合名.find({$or: [{条件1}, {条件2}, {条件3}, ... , {条件n}]})
栗子:db.student.find({$or: [{age:17}, {age:{$gt: 20}}]}) # 年龄等于17或者大于20的
==> and和or联合使用:
db.集合名.find({条件1, 条件2, $or:[条件1, 条件2, 条件3, ... , 条件n]})
7. limit 和 skip
==> limit()方法:读取指定数量的数据记录
db.集合名.find().limit(数字)
==> skip()方法:跳过指定数量的数据
db.集合名.find().skip(数字)
==> skip()方法与limit()方法联合使用:用于实现数据分页
db.集合名.find().skip(数字).limit(数字)
8. 排序
==> sort()方法
db.集合名.find().sort({<key>:1/-1}) # 1 升序 -1 降序
栗子:db.student.find().sort({age:1}) # 按照年龄升序排序
五、pymongo的使用
1. 安装:pip install pymongo
2. 使用
==> 添加文档:
from pymongo import MongoClient # 连接服务器 # conn = MongoClient(host, port) conn = MongoClient("host", 27017) # host:主机地址,mongo默认端口号:27017 # 连接数据库 # 方法一:db = conn.数据库名 # 方法二:db = conn["数据库名"] db = conn["mydb"] # 认证,如果数据库未设置,则可省略此步骤 db.authenticate("name", "password") # 获取集合 # 方法一:collection = db.集合名 # 方法二:collection = db["集合名"] collection = db["student"] # 添加文档 collection.insert({"name": "yanxiujuan", "age": 18, "gender": 0}) # 断开连接 conn.close()
==> 更新文档
from pymongo import MongoClient client = MongoClient("host", 27017) db = client["db_name"] collection = db["collection_name"] # 更新文档 collection.update({"name": "yxj"}, {"$set": {"age": 18}}) client.close()
==> 删除文档
from pymongo import MongoClient client = MongoClient("host", 27017) db = client["db_name"] collection = db["collection_name"] # 删除文档 collection.remove({"name": "yxj"}) client.close()
==> 查询文档(重点)
from pymongo import MongoClient from bson.objectid import ObjectId import pymongo client = MongoClient("host", 27017) db = client.mydb collection = db.student # 查询文档 result = collection.find({"age": {"$gt": 18}}) # 如果是多条数据,使用for循环取数据 for row in result: print(row) print(type(row)) # dict类型 # 统计查询 result2 = collection.find({"age": {"$gt": 18}}).count() # 根据id查询 --> 需要引入三方库 from bson.objectid import ObjectId result3 = collection.find({"_id": ObjectId("id值")}) # 排序 # 1)升序 result4 = collection.find({}).sort("age") # 2)降序 --> 需要引入pymongo库 import pymongo result5 = collection.find({}).sort("age", pymongo.DESCENDING) # 分页 result6 = collection.find().skip(3).limit(5) # 跳过3条,拿5条 client.close()