MongoDB的介绍
- MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
一、MongoDB 与sql的区别
- 它和我们使用的关系型数据库最大的区别就是约束性 ,可以说文件型数据库几乎不存在约束性,理论上没有主外键约束,没有存储的数据类型约束等等
- 关系型数据库中有一个 “表“的概念,有 “字段“的概念,有 "数据条目" 的概念。MongoDB中也同样有以上的概念,但是名称发生了一些变化,严格意义上来说,两者的概念即为相似,但又有些出入,不过无所谓,我们就当是以上概念就好啦
- 下面我们用关系型数据库做的一张很简单的User表: image.png
- 接下来我们再看一下MongoDB的数据结构: image.png
- 那么你就该恍然大悟了吧,MongoDB的每个表(Collection)中存储的每条数据(Documents)都是一个一个的Json,Json中的每一个字段(Key)我们称之为:Field
- 就此我们引出了三个关键字,Collection也就是关系型数据库中"表"的概念,Documents就是"数据条目"就是“行”,Field就是"字段"
二、MongoDB安装部署
三、使用MongoDB
- 首先要先牢记MongoDB中一个重要的概念:MongoDB中如果你使用了不存在的对象,那么就等于你在创建这个对象哦
1、use LuffyCity 创建并使用数据库
2、db 显示当前使用的数据库
image.png3、db.Oldboy 创建并使用表(Colletion)
4、exit 退出数据库
5、插入数据
-
- insert:插入一条或者多条数据,需要带有允许插入多条的参数,这个方法目前官方已经不推荐喽 image.png
- __solts__ = ["usename","pwd"] 限制插入的必须有这两个字段
- 2、insertOne: 插入一条数据,官方推荐 image.png
- 3、insertMany:插入多条数据,无需参数控制,官方推荐 image.png
6、查询数据
- 注意:
- 这里不是select,如果你的第一反应是select 证明你关系型数据库没白学
- 这里没有findMany
- 1、find() 无条件查找:将该表(Collection)中所有的数据一次性返回
image.png
- db.Oldboy.find({name:"WuSir2b"}) 条件查找:name等于WuSir2b的数据
- 其中"_id":ObjectId("乱七八糟一道对看着毫无关系的一对字符串")就是MongoDB自动给我们添加到系统唯一标识"_id" 是一个ObjectId
- 2、findOne()
- findOne()无条件查找一条数据,默认当前Collection中的第一条数据 image.png
- findOne({age:19}) : 条件查找一条age等于19的数据,如有多条数据则返回更靠前的数据
- find({条件,条件}) 相当于and
- find({$or:[{name:jin},{age:{$lt:50}}]})相当于or
7、修改数据
- 1、update update({"name":"DragonFire"},{$set:{"age":21}}):根据条件修改该条数据的内容,官方不推荐
- 把name等于DragonFire中的age改为21,这里要注意的是({"条件"},{"关键字":{"修改内容"}}),其中如果条件为空,那么将会修改Collection中所有的数据 image.png
- updateOne*({"age":19},{$set:{"name":"WSSB"}}):根据条件修改一条数据的内容,如出现多条,只修改最高前的数据,把age等于19的所有数据中第一条数据的name改为WSSB image.png
- updateMany({"age":19},{$set:{"name":"pig_qi"}}):根据条件修改所有数据的内容,多条修改,把age等于19的所有数据中的name改为WSSB image.png
- 注意:
- 解释一下: $set 是update时的关键字,表示我要设置name属性的值为"WSSB"
- 如果该条Documents没有name属性,他就会自动创建一个name属性并且赋值为"WSSB"
8、删除数据
- 1、remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection 官方不推荐 image.png
- 2、remove({"name":"DragonFire"}) :条件删除name等于"DragonFire"的所有Document
image.png
-
官方推荐写法:
- deleteOne({})
- deleteMany({})
-
官方推荐写法:
四、MongoDB 数据类型
- 1、数据类型
-
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类型,时间戳可以秒杀一切时间类型)
-
- 2、MongoDB的数据类型详解
- 1.Object ID :
image.png - ObjectId("时间戳+机器码+线程进程ID+计数器"):不能被json
- 想要能json需要先转换成字符串
- 1.Object ID :
data = {"username":"jinwangba","user_id":ObjectId("5bc6b21ef7ac9a09b4ff6c0e")}
data["user_id"] = str(data["user_id"])
print(json.dumps(data))
- 想要字符串转换成ObjectId类型
objid = "5bc6b21ef7ac9a09b4ff6c0e"
print(objid,type(objid)) # 字符串类型
print(ObjectId(objid),type(ObjectId(objid))) # ObjectId(objid)转换成ObjectId类型
"_id" : ObjectId("5b151f8536409809ab2e6b26")
#"5b151f85" 代指的是时间戳,这条数据的产生时间
#"364098" 代指某台机器的机器码,存储这条数据时的机器编号
#"09ab" 代指进程ID,多进程存储数据的时候,非常有用的
#"2e6b26" 代指计数器,这里要注意的是,计数器的数字可能会出现重复,不是唯一的
#以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息
#注意:这个类型是不可以被JSON序列化的
- 这是MongoDB生成的类似关系型DB表主键的唯一key,具体由24个字节组成:
-
0-8字节是时间戳,
-
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
-
15-18字节的进程id,表示相同机器的不同MongoDB进程。
-
19-24字节是计数器
-
- 2.String :
image.png- UTF-8字符串,记住是UTF-8字符串
- 3.Boolean :
image.png
- true or false 这里首字母是小写的
- 4.Integer整数
image.png
- 整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
- 5.Double :
image.png
- 浮点数 (MongoDB中没有float类型,所有小数都是Double)
- 6.Arrays : image.png
{
"_id" : ObjectId("5b163830993ddc4cd4918ead"),
"name" : "LuffyCity",
"teacher" : [
"DragonFire",
"WuSir2B",
"Alex AGod"
]
}
数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦
- 7.Object : image.png
{
"_id" : ObjectId("5b163915993ddc4cd4918eaf"),
"name" : "LuffyCity",
"course" : {
"name" : "Python",
"price" : 19800
}
}
+ 如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
- 8.Null :空数据类型 , 一个特殊的概念,None Null image.png
{
"_id" : ObjectId("5b163a0e993ddc4cd4918eb0"),
"name" : "LuffyCity",
"course" : null
}
- 9.Timestamp :时间戳 image.png
{
"_id" : ObjectId("5b163bbf993ddc4cd4918eb3"),
"name" : "LuffyCity",
"date" : 1528183743111
}
- 10.Date : image.png
{
"_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),
"name" : "LuffyCity",
"date" : ISODate("2018-06-05T15:28:33.705+08:00")
}
网友评论