注册mongodb数据库为服务(方便后续测试学习使用):
管理员打开cmd,执行
mongod.exe --dbpath=D:\install\MongoDB\data --logpath=D:\install\MongoDB\log\mongodb.log --install --serviceName "MongoDB"
--dbpath指的的mongodb安装路径,logpath指的是mongodb日志存放路径,--install --serviceName指的是安装成为系统服务,服务名称为 MongoDB
一、简单了解
-
初步使用
使用不存在的对象,即创建该对象 > use my_db --》创建数据库并且使用 switched to db my_db > db --》查询当前所在数据库 my_db > db.my_collection --》创建并使用collection my_db.my_collection > show dbs --》 查询当前所有数据库(只创建,没数据,默认不显示,就是不存在) admin 0.000GB local 0.000GB
use db1--》创建一个db1 db.user.insert({id:1,name:"li",age:24})--》创建一个表,并插入一条数据 db.user.find()--》查询数据 { "_id" : ObjectId("5bc70768af328e86fb4fbe97"), "id" : 1, "name" : "li", "age" : 24 }
-
MongoDB结构:
表 Collections --》 user 行 Documents --》 {} 字段 Fields --》 id:1
-
命令格式,db代指当前使用的数据库
命令的格式:"db.表名(Collection).操作(参数)"
-
数据在数据库的存储状态
{ ID:1, name:zhangsan, age:84, hobby:[吃,喝,玩] }, { ID:2, name:wangmazi, age:73, hobby:[睡] }, { ID:2, name:liuwu, age:73, hobby:[{ date:2018年10月17日, name:"zhangsan" }] }
二、基本增删改查
-
插入
废弃:db.user.insert([{}])--》插入一条或多条 一条:db.user.insertOne({id:2,name:'hehe',age:18}) 多条:db.user.insertMany([{id:3},{id:4,user:'hihi'},{id:5,ade:23}])
-
删除
废弃:db.user.remove({id:3})--》符合条件的所有 一条:db.user.deleteOne({})--》删除对象的查询条件 多条:db.user.deleteMany({id:1})--》满足条件的多条数据
-
清空
db.user.deleteMany({})--》不写条件,整个表清空 db.user.drop()
-
更改
废弃:db.user.update({},{$set:{}}) 一条:db.user.updateOne({id:3},{$set:{name:'张三'}})--》前面是查询条件,后面是更改字段,只改第一条 多条:db.user.updateMany({id:3},{$set:{gender:'男',hobby:[1,2,3]}})--》可增加字段
$set 修改器之一,设定,将某key设定为某值
-
查询
多条:db.user.find({age:18})--》查询符合条件的所有 一条:db.user.findOne({name:'lala'}) 并列条件查询: db.user.findOne({name:'lala',age:18})--》并列条件 db.user.find({id:3,$or: [{name:'lala',age:18}]})--》并列条件
三、基本数据类型
-
数据类型概览
Object ID :Documents 自生成的 _id--》宇宙唯一 String: 字符串,必须是utf-8 Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写) Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32) Double:浮点数 (没有float类型,所有小数都是Double) Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦) Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典 Null:空数据类型 , 一个特殊的概念,None Null Timestamp:时间戳 Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
-
ObjectId数据类型详解
"_id" : ObjectId("5b151f8536406806ab2e6b26") 哪个时间--》#"5b151f85" 代指的是时间戳,这条数据的产生时间 哪个机器--》#"364068" 代指某台机器的机器码,存储这条数据时的机器编号 哪个进程--》#"06ab" 代指进程ID,多进程存储数据的时候,非常有用的 第几条数据--》#"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的 #以上四种标识符拼凑成世界上唯一的ObjectID #只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换 #可以得到以上四种信息 #注意:这个类型是不可以被JSON序列化的,可用下面方法转化成字符串,之后再序列化 res = list(mongo_db.content.find({})) for index, item in enumerate(res): res[index]['_id'] = str(item['_id']) print(type(res[0]['_id'])) # <class 'str'> # 将字符串格式的转化为objectid数据类型 from bson import ObjectId mongo_db.users.find_one({"_id": ObjectId(user_id)})
四、$关键字及$修改器
-
查
含义:大于 小于 大于等于 小于等于 等于 $gt $lt $gte $lte 'age':18/$eq 格式:db.user.find({'age':{$lt:20}})
-
改
$unset: 删除某个字段 db.user.updateOne({name:'lala'},{$unset:{hobby:0}}) $inc: 原有值基础上增加/数字增加,字符串拼接 db.user.updateOne({name:'lala'},{$inc:{age:1}}) $push: 在Arrays中添加一个元素/没有该Arrays则直接添加 db.user.updateOne({name:'lala'},{$push:{hobby:1}}) $pull: 在Arrays中删除元素/有重复的则全部删除 db.user.updateOne({name:'lala'},{$pull:{hobby:1}}) $pop: db.user.updateOne({name:'ddd'},{$pop:{hobby:1}})--》删除Arrays中的最后一个元素 db.user.updateOne({name:'ddd'},{$pop:{hobby:-1}})--》删除Arrays中的第一个元素
-
$:存储 满足前置条件列表元素的下标索引
更改Arrays中的某个值(根据定位修改) db.user.updateOne({name:'lala',hobby:'玩'},{$set:{'hobby.$':'学习}}) db.user.updateOne({name:'lala'},{$set:{'hobby.1':'运动}}) 混搭:如果数组中放的是对象,要修改对象 db.user.updateOne({name:'hehe'},{$set:{course:[ {课程:'语文',分数:90}, {课程:'数学',分数:100}, {课程:'英语',分数:80}, ]}}) 改: db.user.updateOne({name:'hehe','course.课程':'英语'},{$set:{'course.$.分数':85}}) 自增: db.user.updateOne({name:'hehe','course.课程':'英语'},{$inc:{'course.$.分数':5}})
-
查询$关键字
如果列表中是[1,2,3],用↓方法查询就找不到 db.user.find({hobby:[3,2,1]}) 用↓方法就能找到 db.user.find({hobby:{$all: [3,2,1]}}) $all:满足所有元素的数据 db.user.find({hobby:{$all: [1,2,3,4]}})--》没有4就不行 $in:满足其中一个元素的数据 db.user.find({hobby:{$in: [1,4]}})--》只要有1就行 $or:满足其中一个字段的数据 db.user.find({$or:[{'name':'lala'},{'user':'hihi'}]})
五、limit、sort、skip
-
limit:查询前几条
db.user.find({}).limit(5)
-
skip:跳过第几条开始查询
db.user.find({}).skip(2) 可做分页:先执行skip,再执行limit db.user.find({}).skip(2).limit(3)
-
sort:按什么排序
db.user.find({}).sort({ 'id':-1 })有大到小 db.user.find({}).sort({ 'id':1 })有小到大
六、python操作mongodb
import pymongo
mongo_client = pymongo.MongoClient(host='127.0.0.1', port=27017)
mongo_db = mongo_client['db1']
-
【查】*****************************************************************
# find: res = mongo_db.content.find() print(res) # <pymongo.cursor.Cursor object at 0x0000022EB277D6D8> 类似迭代器,用一次就没了。 print(list(res)) # 【转成列表】 for i in enumerate(list(res)): # 【循环遍历】 print(i) print(i[1]) print(i[1].get('name'))
# find_one: res = mongo_db.chat.find_one() print(res) print(res.get('_id')) # 【字典可get取值】
# find_one: res = mongo_db.user.find_one({'name':'lala'}) print(res)
-
【增】*****************************************************************
# insert_one: res = mongo_db.chat.insert_one({}) print(res,res.inserted_id,type(res.inserted_id)) # <pymongo.results.InsertOneResult object at 0x00000206C10EE508> 5bcdc5122b12304cbc31ebaa <class 'bson.objectid.ObjectId'>
# insert_many: res = mongo_db.chat.insert_many([{},{},{}]) print(res,res.inserted_ids) # <pymongo.results.InsertManyResult object at 0x000002771950E548> # [ObjectId('5bc7668c2b12302d44c0033a'), ObjectId('5bc7668c2b12302d44c0033b'), ObjectId('5bc7668c2b12302d44c0033c')]
-
【改】*****************************************************************
# update_one: res = mongo_db.users.update_one({'username':'user2'},{'$set':{'username':'哎呀妈呀脑瓜疼','gender':0}}) print(res,dir(res))
# update_many: res = mongo_db.user.update_many({'id':3},{'$set':{'age':20}}) print(res,dir(res))
-
【删】*****************************************************************
# delete_one: res = mongo_db.user.delete_one({'name':'lala'}) print(res,res.deleted_count)
# delete_many: res = mongo_db.user.delete_many({}) print(res,res.deleted_count)
七、设置过期时间
from pymongo import MongoClient
cli = MongoClient()
db = cli['test'] # 数据库
tbl = db['test_timer2'] # 表
tbl.create_index([("timer2", 1)], expireAfterSeconds=10)
# 【给这个字段设置一个过期时间,这个字段必须是utc时间,没有此字段的,或者此字段是其他数据类型的则无效】
# 【他是根据这个字段进行自动删除的】
from datetime import datetime
【方式一】
tbl.insert({"timer2": datetime.utcnow(), "user": "Hehehehe!"}) # 此条数据会自动删除
【方式二】
from time import strptime, time, mktime
t1 = strptime("2017/3/25 13:36:02", "%Y/%m/%d %H:%M:%S")
t2 = datetime.utcfromtimestamp(mktime(t1))
tbl.insert({"timer2": t2, "TT": 1}) # 此条数据会自动删除
cli.close()
tbl.insert({"timer2": 456, "CC": 12345}) # 此条数据不会自动删除
"""
创建索引和指定过期时间的方式类似,要注意的是过期时间的字段必须使用UTC时间,否则无法正常删除记录
因此指定过期时间删除虽然也可以起作用,但是不能确定删除时间非常精确。
"""
网友评论