MongoDB的基本使用
数据库
一,查看所有的数据库
show dbs
或者
show datagbases
二,查看当前正在使用的数据库
db
这里要注意:在没有切换数据库的情况下默认使用test数据库
三,切换数据库
use 数据库名字
四,创建数据库
同样使用 use 数据库的名字
这里要注意:在数据库不存在的情况下,会创建数据库,否则会切换到指定数据库
同时刚创建的数据库用show databases并没有办法看到它,需要在数据库中插入一些数据,才会在show databases中显示
MongoDB 中默认的数据库为 test,如果你没有创建新的数据库,集合将存放在 test 数据库中
五,删除当前的数据库
db.dropDatabase()
集合
一,查看当前数据库中所有的集合
show collections
二,创建集合
1,自动创建集合
向不存在的集合中第一次插入数据时,集合会被自动创建出来
2,手动创建集合
命令格式如下,
db.createCollection(name,options)
demo:
db.createCollection(“clt”)
demo2:
db.createCollection(“clt”, {capped : true, size : 10 })
说明:
参数capped: 默认值为false表示不设置上限,值为true表示设置上限
参数size: 当capped值为true时, 需要指定此参数, 表示上限⼤⼩,当⽂档达到上限时, 会将之前的数据覆盖, 单位为字节
检查集合是否有上限: db.集合名.isCapped()
三,删除集合
db.集合名称.drop()
文档相关
一,常见的数据类型
- Object ID : 文档ID
- String : 字符串,最常用,必须时有效的UTF-8
- Boolean : 存储一个布尔值,true或false
- Integer : 整数可以是32位或64位,这取决于服务器
- Double : 存储浮点值
- Arrays : 数组或列表,多个值存储到一个键
- Object : 用于嵌入式的文档,即一个值为一个文档
- Null : 存储Null值
- Timestamp : 时间戳, 表示从1970-1-1到现在的总秒数
10.Date : 存储当前日期或时间的UNIX时间格式
二,注意点
每个⽂档都有⼀个属性, 为_id, 保证每个⽂档的唯⼀性,mongodb默认使用_id作为主键
可以⾃⼰去设置_id插⼊⽂档,如果没有提供, 那么MongoDB为每个⽂档提供了⼀个独特的_id, 类型为objectID
objectID是⼀个12字节的⼗六进制数,每个字节两位,一共是24 位的字符串: 前4个字节为当前时间戳 接下来3个字节的机器ID 接下来的2个字节中MongoDB的服务进程id 最后3个字节是简单的增量值
MongoDB的增删改查
一,MongoDB的插入
MongoDB可以使用 insert() 或 save() 方法向集合中插入文档
1,insert()
db.集合名字.insert(document)
demo:
db.clt.insert({name:‘hhh’,gender : 1})
这里注意:就像上面说的,在你插入文档的时候 如果没有指定_id参数,那么MongoDB会为文档分配一个唯一的ObjectID
2,save()
db.集合名称.save(document)
说明:
save()和insert()的区别在于如果存在{_id : 1 : name : “n1”}的信息
那么添加
db.clt.insert({_id : 1, name : n2})的时候会报主键重复的错误
db.clt.save({_id : 1, name : n2})则会把n1修改成n2
即save插入文档时,如果文档_id已经存在则修改,如果文档的_id不存在则添加
二,MongoDB的简单查询
db.集合的名字.find()
db.集合的名字.find().pretty()可以用易读的方式来读取数据
三,MongoDB的更新
db.集合名字.update(, ,{multi : })
说明:
- 参数query : 输入查询条件
- 参数update : 更新操作符
- 参数multi可选 ,默认是false,表示只更新找到的第一条记录,值为true则把满足条件的文档全部更新
demo: 查询到的第一条用新的文档进行覆盖
db.clt.update({name : ‘hhh’},{name : ‘jjj’})
demo2: $set 替换掉指定字段的值
db.clt.update({name:‘hr’},{$set:{name:‘hys’}})
demo3 : 加上{multi : true})会更新根据查询条件查到的所有文档
更新全部查到的文档
db.clt.update({},{$set : {gender : 0}},{multi : true})
这里需要注意的是更新全部只适用于$set操作符
四,MongoDB的删除
db.集合名字.remove(, {justOne : })
说明:
- 参数query:删除的文档的条件
- 参数justOne:如果设为true ,则只删除一条,默认为false,表示删除所有符合条件的文档
查询进阶
一,数据查询
-
方法find() : 查询
db.集合名字.find({条件文档}) -
方法findOne() : 查询,只返回第一个
db.集合名字.findOne({条件文档}) -
方法pretty() : 将结果格式化
db.集合名字.find({条件文档}).pretty()
二,比较运算符
MongoDB的比较运算符如下:
- 等于 : 默认是等于判断,没有运算符
- 小于 : $lt
- 小于等于 : $lte
- 大于 : $gt ()
- 大于等于 : $gte
- 不等于 : $ne
demo:查询age大于或等于18的文档
db.clt.find({age : {$gte : 18}})
三,逻辑运算符
这里的逻辑运算符主要指与,或逻辑
-
and : 在json中写入多个条件即可
例如 :
查询age大于或等于18,并且gender为true的文档
db.clt.find( {age:{$gte : 18} },{gender : true} ) -
or : 使用$or,值为数组,数组中每个元素为json
例如:
查询age大于18,或gender为false的学生
db.clt.find( {$or : [ {age : {$gt:18} },{gender:false} ] } )
四,范围运算符
使用$in,$nin 判断数据是否在某个数组内
查询age为18,28的学生
db.clt.find( {age : {$in : [18,28] } } )
五,编写正则表达式查询
使用 / / 或 $regex 编写正则表达式
查询以"郭"开始的name
-
方式1:
db.clt.find( {name : /^郭/} ) -
方式2 :
db.clt.find( {name : {$regex : “^郭”} } )
六,指定域查询
-
只输出name和age域,第一个参数为查询条件,空代表查询所有
db.clt.find( {}, { name: 1, age: 1 } ) -
默认_id是显示的,可以通过设为0不显示
db.clt.find( {}, { name: 1, age: 1 ,_id:0} ) -
如果需要输出的字段比较多,不想要某个字段,可以用排除字段的方法
不输出内容字段,其它字段都输出
db.clt.find({}, {_id:0})
七,自定义查询
由于mongo的shell是一个js的执行环境 使⽤$where后⾯写⼀个函数, 返回满⾜条件的数据
查询年龄⼤于30的学⽣
db.clt.find({ $where:function() { return this.age>30; } })
Python与MongoDB交互
一,MongoDB和Python交互的模块
pymongo 提供了MongoDB和python交互的所有方法
安装方式:pip install pymongo
二,使用pymongo
1,导入pymongo并选择要操作的集合
数据库和集合如果没有的话会自动创建
from pymongo import MongoClient
client = MongoClient(host, port)
collection = client[db名][集合名]
2,添加数据
insert可以批量的插入数据列表,也可以插入一条数据
# 插入一条数据
collection.insert({"name": "test10010", "age": 33})
# 插入多条数据
collection.insert([{"name": "test10010", "age": 33}, {"name": "test10011", "age": 34}])
3,添加一条数据
# 插入一条数据
ret = collection.insert_one({"name": "test10010", "age": 33})
print(ret)
4,添加多条数据
# 插入多条数据
item_list = [{"name": "test1000%d" % i} for i in range(10)]
# insert_many接收一个列表,列表中为所有需要插入的字典
t = collection.insert_many(item_list)
5,查找一条数据
# find_one查找并且返回一个结果,接收一个字典形式的条件
t = collection.find_one({"name": "test10005"})
print(t)
print(type(t))
6,查找全部数据
结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针
# 根据查询条件返回所有满足条件的结果
# t = collection.find({"name": "test10005"})
# find返回所有满足条件的结果,如果条件为空,则返回数据库的所有
t = collection.find()
# 结果是一个Cursor游标对象,是一个可迭代对象,可以类似读文件的指针,
for i in t:
print(i)
print("-" * 50)
for i in t: # 此时t中没有内容
print(i)
7,更新一条数据
注意使用$set命令
# update_one更新一条数据
collection.update_one({"name": "test10005"}, {"$set": {"name": "new_test10005"}})
8,更新全部数据
# update_one更新全部数据
collection.update_many({"name": "test10005"}, {"$set": {"name": "new_test10005"}})
9,删除一条数据
# delete_one删除一条数据
collection.delete_one({"name": "test10010"})
10,删除全部数据
# delete_may删除所有满足条件的数据
collection.delete_many({"name": "test10010"})