MongoDB
Posted 嗯姆嗯姆嗯姆
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB相关的知识,希望对你有一定的参考价值。
1. MongoDB之原生ORM
使用了不存在的对象即创建该对象 **不存在关系链接**
不存在SQL语句nosql
格式:
[{
id:1
name:"蔡文姬"
age: 16
gender:"女"
},
{
id:1
name:"蔡文姬"
age: 16
sex:["女","girl","老阿姨"]
other:{
hobby:["男","boy","小哥哥"]
}
}]
1. 首先创建一个数据库
use SS2Day4 穿件数据库并使用该数据库
db 显示当前使用的数据库
db.users 创建并使用Collection(表)
2. 增查改删(insert find update remove)
插入:
db.users.insert({"name":"蔡文姬","age":16}) # 建议不要使用 不推荐使用
查询:
db.users.find() #无条件查找:将该表(Collection)中所有的数据一次性返回
更新:
db.users.update({"name":"蔡文姬"},{$set:{"age":18}})# 建议不要使用 不推荐使用
删除:
db.users.remove({"age":21}) # 建议不要使用 不推荐使用
remove({"name":"DragonFire"}) : 条件删除name等于"DragonFire"的所有Document
-------------------------------------------------------------------------------
table Collections 表
row Documents 数据条目
column Field 字段(key值)
2.MongoDB 数据类型
数据类型:
?
(1)Object ID :Documents 自生成的 _id
Object ID :Documents 自生成的 _id 并且 不支持转换成JSON字符串
?:{"_id" : ObjectId("5bda5293c6c72e52ffc7e91e")}
ObjectId:"5bda5293c6c72e52ffc7e91e"
0-8字节是时间戳,
9-14字节的机器标识符,表示MongoDB实例所在机器的不同;
15-18字节的进程id,表示相同机器的不同MongoDB进程。
19-24字节是计数器
#以上四种标识符拼凑成世界上唯一的ObjectID
#只要是支持MongoDB的语言,都会有一个或多个方法,对ObjectID进行转换
#可以得到以上四种信息
?
#注意:这个类型是不可以被JSON序列化的
?
(2)String: 字符串,必须是utf-8
?
(3)Boolean:布尔值,true 或者false (这里有坑哦~在我们大Python中 True False 首字母大写)
?
(4)Integer:整数 (Int32 Int64 你们就知道有个Int就行了,一般我们用Int32)
?
(5)Double:浮点数 (没有float类型,所有小数都是Double)
?
(6)Arrays:数组或者列表,多个值存储到一个键 (list哦,大Python中的List哦)
?
{
"_id" : ObjectId("5b163830993ddc4cd4918ead"),
"name" : "LuffyCity",
"teacher" : [
"DragonFire",
"WuSir2B",
"Alex AGod"
]
}
?
(7)Object:如果你学过Python的话,那么这个概念特别好理解,就是Python中的字典,这个数据类型就是字典
?
{
"_id" : ObjectId("5b163915993ddc4cd4918eaf"),
"name" : "LuffyCity",
"course" : {
"name" : "Python",
"price" : 19800
}
}
?
(8)Null:空数据类型 , 一个特殊的概念,None Null
?
(9)Timestamp:时间戳
?
{
"_id" : ObjectId("5b163bbf993ddc4cd4918eb3"),
"name" : "LuffyCity",
"date" : 1528183743111
}
?
(10)Date:存储当前日期或时间unix时间格式 (我们一般不用这个Date类型,时间戳可以秒杀一切时间类型)
?
{
"_id" : ObjectId("5b163ba1993ddc4cd4918eb2"),
"name" : "LuffyCity",
"date" : ISODate("2018-06-05T15:28:33.705+08:00")
}
3. 增删改查支持方式
insert:
db.users.insertMany([{"name":"王三"},{"name":"王舞"}]) # 插入多条
db.user.insertOne({"name":"刘老师"}) # 插入一条
?
remove:
#remove({}):无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
db.users.deleteOne({"age":63})
db.users.deleteMany({"age":30})
?
update:
({"条件"},{"关键字":{"修改内容"}})
如果条件为空,那么将会修改Collection中所有的数据
updateOne({"age":19},{$set:{"name":"WSSB"}}):根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
updateMany({"age":19},{$set:{"name":"pig_qi"}}):根据条件修改所有数据的内容,多条修改
?
把age等于19的所有数据中的name改为WSSB
?
?
?
find:
没有findMany
db.users.find({})
db.users.findOne({})
db.user.findOne({"name":"王舞"})
#findOne()无条件查找一条数据,默认当前Collection中的第一条数据
#一条数据转为 json格式
4. 数学比较符
$lt: <
$lte: <=
$gt: >
$gte: >=
$eq: ==
: : == or = "name":"王舞" 即 name=王舞
5. $
"$" 在 update 中 加上关键字 就 变成了 修改器
其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符
?
存储满足条件的数据下标索引位置(满足查询条件一条数据下标索引)
db.users.updateOne({"other.name":"linux","name":"银网吧"},{$set:{"other.$.score":19}})
$定位不到第二层
弊端:[
[1,2,3],
[{k:{zk:zv}},{k2:v2},{k3:v3}],
[4,5,6],
]
深度查询查询速度慢(建议最大4层)
6. $关键字 查询
$or : db.users.find({$or:[{age:18},{name:"银网吧"}]})
$and : , (一般不用)
$in : db.users.find({age:{$in:[18,84,73]}})
$all : db.users.find({hobby:{$all:[1,2,3,4,5,6]}})
查询条件必须包含在列表里([1,2,3]可以,[2,3,4,5,7]不行)
7. $修改器 update
$set:
直接将字段的值设定为value
?
$unset:
删除字段(用来删除Key(field)的)
?
$inc:
将查询到的结果 加上某一个值 然后保存
原值增加 db.users.updateMany({name:"金王吧"},{$inc: {cursors: 1}})
db.users.updateMany({name:"金王吧"},{$inc: {cursors: -10}})
8. $array 修改器
$push :
它是用来对Array (list)数据类型进行 增加 新元素的,相当于Python中 list.append() 方法
append(item) db.users.updateMany({name:"金王吧"},{$push: {hobby:10}})
?
$pull :
有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
remove(item) db.users.updateMany({name:"金王吧"},{$pull: {hobby:10}})
?
$pop :
指定删除Array中的第一个 或 最后一个 元素
pop() db.users.updateMany({name:"金王吧"},{$pop: {hobby:-1}}) 1最后一个 -1第一个
{$pop:{"test_list" : -1}} -1 代表最前面, 1 代表最后边 (这和Python正好相反)
9.Array Object 的特殊操作
建立一条数据包含array 和 object
?
{
"_id" : ObjectId("5b17d01a49bf137b585df891"),
"name" : "骑士计划",
"price" : [
19800,
19500,
19000,
18800
],
"other" : {
"start" : "2019年11月1日",
"start_time" : "09:30",
"count" : 150
}
}
?
(1) 把price 中的 19000 改为 19300
db.users.update({"name":"骑士计划"},{$set:{"price.2":19300}})
这里引用了下标的方法更改数值,"price.2"代指Array中的第三个元素
?
(2)如果price.1 中小于19800 则加200
db.users.update({"name":"骑士计划","price":{$lt:19500}},{$inc:{"price.$":200}})
?
(3)把other中 count 改为 199
db.users.update({"name":"骑士计划"},{$set:{"other.count":199}})
?
对了就是在这个对象 打点儿 key 就可以更改数值了 , 要注意的是, 咱们用的 $set 进行修改的,那么就意味着,如果没有"other.count"这个field的话,他会自动创建
?
?
(4)如果 count 小于 200 那么 加 10
db.users.update({"name":"骑士计划","other":{$lt:200}},{$inc:{"other.count":10}})
?
Array + Object 的用法
{
"_id" : ObjectId("5b17de9d44280738145722b9"),
"name" : "骑士计划",
"price" : [
{
"start" : "2018年8月1日",
"start_time" : "08:30",
"count" : 150
},
{
"start" : "2018年8月2日",
"start_time" : "09:30",
"count" : 160
},
{
"start" : "2018年8月3日",
"start_time" : "10:30",
"count" : 170
},
{
"start" : "2018年8月4日",
"start_time" : "11:30",
"count" : 180
}
]
}
?
(1)把count 大于 175 的field 加 15
db.users.update({"price.count":{$gt:175}},{$inc:{"price.$.count":15}})
?
(2) 把 count 大于 180 的 start 改为 "2018年8月10日"
db.users.update({"price.count":{$gt:180}},{$set:{"price.$.start":"2017年8月10日"}})
10. Limit选取 Skip跳过 Sort排序
(1)limit :
db.users.find({}).limit(2) 显示条目数量
limit(2) 就是选取两条Document(数据条目), 从整个Collection的第一条 Document 开始选取两条
?
(2)skip :跳过 db.users.find({}).skip(1) 跳过条目数量
skip(2) 就是跳过两条Document, 从整个Collection 的第一条 Document 开始跳,往后跳两条
(3)简单分页(limit+skip) :
db.users.find({}).limit(当前页码*每页条目).skip(每页条目)
?
(4)Sort 排序 : 将结果按照关键字排序
db.users.find({}).sort({ "price":1 }) 1:ASC -1:DESC
按照 price 字段进行升序 , 1 为升序 , -1 为降序
?
(5) 分页排序多重用法 Limit + Skip + Sort:
db.users.find({}).sort({ age:-1 }).limit(2).skip(2)
?
***重点 : Sort + Skip + Limit 是有执行优先级的 他们的界别分别是
优先 Sort 其次 Skip 最后 Limt
?
Skip + Limit 的优先级 也是先 Skip 再 Limit**
11. python 操作MongoDB
安装 pymongo
?
import pymongo
mongo = pymongo.MongoClient("127.0.0.1",27017)
MONGODB = mongo["SS2DAY04"]
增删改查
1.查(find find_one)
result = list(MONGODB.users.find({}))
for item in result:
print(item)
print(result)
?
result_one = MONGODB.users.find_one({})
?
?
2. 增 (insert_one insert_many)
res = MONGODB.student.insert_one({"name":"yd","nickname":"wl"})
print(res.inserted_id,type(res.inserted_id))
res = MONGODB.student.insert_many([{"name":"yd","nickname":"wl"}, {"name":"wpq","nickname":"cb"},{"name":"lj","nickname":"dsb"}])
?
print(res.inserted_ids)
?
3. 删(remove delete_one delete_many)
# MONGODB.student.remove({})
# MONGODB.student.delete_one({"name":"yd"})
# MONGODB.student.delete_many({"name":"yd"})
?
4. 改 (update update_one update_many)
# MONGODB.student.update({"name":"yd"})
# MONGODB.student.update_one({"name":"wpq"},{"$set":{"nickname":"peppa pig"}})
# MONGODB.student.update_many({},{"$set":{"age":84}})
?
5. 分页
res = MONGODB.users.find({}).sort("age",pymongo.ASCENDING).limit(2).skip(0)
for i in res:
print(i)
# 删:
# MONGODB.student.delete_many({}) #清除数据
# MONGODB.student.drop() # 删除表格
以上是关于MongoDB的主要内容,如果未能解决你的问题,请参考以下文章
ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项
在 Spring MongoDB 的 ReplaceRoot 管道阶段使用 $mergeObjects