mongodb初识
http://www.mongodb.org.cn/manual/aggregation-group/
1.启动
mongod - 改变data/db位置: --dbpath D:\data\db
mongod --install 安装windows系统服务
mongod --remove 卸载windows系统服务
mongo 打开客户端 cmd 窗口
NoSQLBooster4mongodb
mongod --dbpath=D:\app\mongodb3.4\data\db #启动
丰富多彩的数据类型世界 首先我们要先了解一下MongoDB中有什么样的数据类型: 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.概念
- 使用了不存在的对象即创建该对象
- use db 创建或切换当前数据库 内存中
- db.tablename 创建或使用 tablename 内存中
db.dropDatabase(); 删除库
3.指令
db 查看当前使用的数据库
show databases 查看存放在磁盘上的数据库
show tables 查看当前数据库在磁盘上存储的数据表 - Collection
4.增删改查
增加数据:
官方不推荐:
db.tablename.insert([{}]) 增加数据
官方推荐:
db.tablename.insertOne({}) 增加一条数据
db.tablename.insertMany([{}]) 增加多条数据
db.oldboy.insertOne({"name":"2131","age":20})
db.oldboy.insertMany([{"name":"zaizai"},{"name":"wusir2","age":20}])
> db.oldboy.insertMany([{"name":"Linux","score":59},{"name":"Python","score":100},{"name":"Go","score":80}])
查询数据:
db.oldboy.find() 查询所有
db.tablename.find({查询条件}) 查询所有符合条件的数据
db.tablename.findOne({查询条件}) 查询符合条件的第一条数据
> db.oldboy.find({'age':20})
{ "_id" : ObjectId("5cc429c3b604842e45e52b73"), "name" : "2131", "age" : 20 }
{ "_id" : ObjectId("5cc42ab2b604842e45e52b75"), "name" : "wusir2", "age" : 20 }
> db.oldboy.findOne({'age':20})
{
"_id" : ObjectId("5cc429c3b604842e45e52b73"),
"name" : "2131",
"age" : 20
}
修改数据:
官方不推荐:
db.tablename.update({条件},{修改器:{修改值}}) 修改符合条件的第一条数据
官方推荐:
db.tablename.updateOne({条件},{修改器:{修改值}}) 修改符合条件的第一条数据
> db.oldboy.updateOne({"age":20},{$set:{"name":"1111"}})
{ "acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 }
db.tablename.updateMany({条件},{修改器:{修改值}}) 修改符合条件的所有数据
> db.oldboy.updateMany({"age":20},{$set:{"name":"1111"}})
{ "acknowledged" : true, "matchedCount" : 2, "modifiedCount" : 1 }
> db.oldboy.find()
{ "_id" : ObjectId("5cc429c3b604842e45e52b73"), "name" : "1111", "age" : 20 }
{ "_id" : ObjectId("5cc42ab2b604842e45e52b74"), "name" : "zaizai" }
{ "_id" : ObjectId("5cc42ab2b604842e45e52b75"), "name" : "1111", "age" : 20 }
删除数据:
官方不推荐:
db.tablename.remove({条件}) 删除所有符合条件的数据
官方推荐:
db.tablename.deleteOne({条件}) 删除符合条件的第一条数据
> db.delete.deleteOne({'name':'zaizai'})
{ "acknowledged" : true, "deletedCount" : 0 }
db.tablename.deleteMany({条件}) 删除所有符合条件的数据
db.delete.deleteMany({'name':'zaizai'})
5.修改器:
$set 强制修改 {$set:{name:123}} 强制将name字段的值修改为123 可以创建字段
db.Oldboy.updateOne({"score":20},{$set:{"score":59}}) #把 "score" 为 20 分的 "score" 赋值为 59 分
$unset 删除字段 {$unset:{name:1}} 强制删除name字段
$inc 引用增加 {$inc:{age:1}} 对age字段引用增加 原有数值基础上增加 1
Array
$push 相当于列表数据类型的append 追加数据 {$push:{array:"666"}}
db.Oldboy.update({},{$set:{"test_list":[1,2,3,4,5]}})
db.oldboy.updateMany({"name":"zaizai"},{$pushAll: {"test_list":[7,8,9]}})
$pushAll extend 遍历列表循环追加数据 {$pushAll:{array:["666",777,888]}}#最加多个
$pull 相当于列表数据类型的remove 删除Item {$pull:{array:"666"}}
db.Oldboy.updateMany({"score":59},{$pull:{"test_list":6}})#注意先有push
db.oldboy.updateMany({"name":"zaizai"},{$pushAll: {"test_list":[11,22,33]}})
$pullAll 遍历列表循环删除数据 {$pullAll:{array:["666",777,888]}}
$pop 相当于列表数据类型的pop(0/-1) 只能删除第一个和最后一个 {$pop:{array:1/-1}}
db.Oldboy.updateMany({"score":59},{$pop:{"test_list":-1}})
1 : 删除最后一个
-1:删除第一个
6.$ 特殊用法:
db.tablename.updateOne({hobby:"娟儿"},{$set:{"hobby.$":"小圈儿"}})
存储符合条件元素的下标索引
把其中一个爱好为娟的改成小圆圈
7.$关键字
"$" 在 update 中 加上关键字 就 变成了 修改器
其实 "$" 字符 独立出现也是有意义的 , 我起名叫做代指符
把 "score": 100 的 test_list 里面的 2 改为 9
> db.Oldboy.find() { "_id" : ObjectId("5b990189430c27444ccdd650"), "name" : "Linux", "score" : 100, "test_list" : [ 2, 3, 4 ] }
db.Oldboy.updateOne({"score":100},{$set:{"test_list.0":9}})
把9还原成2
db.Oldboy.updateMany({"score":100,"test_list":9},{$set:{"test_list.$":2}})
$lt 小于
db.Oldboy.find({"score":{$lt:80}})
$gt
$lte
$gte
$ne 不等于
$eq or : 等于
$in {hobby:{$in:["娟儿","小圈儿"]}} 相同字段 or
db.oldboy.find({'name':"Go","score":80}) #不用加in的
> db.oldboy.find({"name":{$in:["Linux","Go"]}})#查询一个键的多个值
{ "_id" : ObjectId("5cc457e4b604842e45e52b76"), "name" : "Linux", "score" : 59
{ "_id" : ObjectId("5cc457e4b604842e45e52b78"), "name" : "Go", "score" : 80 }
$or {$or:[{hobby:"娟儿"},{age:84}]} 不同字段间的 or
db.oldboy.find({$or:[{"score":80},{'score':333}]})#满足任意 $or 条件的数据,至少要满足一个
$all {hobby:{$all:["娟儿","小圈儿"]}} 跟in一个吊样
$and or , {$and:[{hobby:"娟儿"},{age:84}]} 并列条件 之 $and
8.sort skip limit
1.排序 sort .sort({"price":-1})
db.Oldboy.find().sort({"price":1}) 升序
db.Oldboy.find().sort({"price":-1}) 降序序
2.跳过 skip .skip(2)
3.选取 limit .limit(2)
db.Oldboy.find().limit(2)
分页:
db.tablename.find({}).sotr(_id:-1).limit(num).skip((page-1)*num)
$inc 将查询到的结果 加上某一个值 然后保存
db.Oldboy.updateOne({"score":59},{$inc:{"score":1}})
db.Oldboy.updateOne({"score":60},{$inc:{"score":-40}})
经典实例
如果 price.1 中小于19800 则加 200
db.Oldboy.update({"name":"路飞学城-骑士计划","price.1":{$lt:19800}},{$inc:{"price.1":200}})
复习一下:"price.1":{$lt:19800} 是查找 price.1 小于 19800
复习两下:{$inc:{"price.1":200}} 是什么啊? price.1 拿出来 加上 200 之后 再存进去
上节课我们也学习了 $ 的用法,现在我们混搭 $ 再做一个练习
我们把 price 小于 19500 的 自动补上 200
> db.Oldboy.update({"name":"路飞学城-骑士计划","price":{$lt:19500}},{$inc:{"price.$":200}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) > db.Oldboy.find() { "_id" : ObjectId("5b990568430c27444ccdd653"), "name" : "路飞学城-骑士计划", "price" : [ 19800, 19700, 19500, 18800 ], "other" : { "start" : "2018年8月1日", "start_time" : "08:30", "count" : 150 } }
$ 这个只储存一个下标 所以第二个没改
把 count 大于 180 的 start 改为 "2018年8月10日"
db.Oldboy.update({"price.count":{$gt:180}},{$set:{"price.$.start":"2018年8月10日"}})
9.MongoDB偷换的概念
MySql MongoDB
DataBase == DataBase
Table == Collection
Colunm == Field
Row == Documents
模块 pymongo
pip install pymongo
连接
新建一个文件 test_mongo.py
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.find() print(res)
插入数据
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.insert_many([{"name" : "酸菜","price" : "1"},{"name" : "白菜","price" : "2"},{"name" : "小青菜","price" : "0.5"},]) print(res)
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.insert_many([{"name" : "酸菜","price" : "1"},{"name" : "白菜","price" : "2"},{"name" : "小青菜","price" : "0.5"},]) print(res)
执行输出:
<pymongo.results.InsertManyResult object at 0x00000143817B3548>
查询数据
可以将结果转换为列表
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.find() print(list(res))
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.find() print(list(res))
执行输出:
[{'_id': ObjectId('5b991895e125324a58178dd3'), 'name': '酸菜', 'price': '1'}, {'_id': ObjectId('5b991895e125324a58178dd4'), 'name': '白菜', 'price': '2'}, {'_id': ObjectId('5b991895e125324a58178dd5'), 'name': '小青菜', 'price': '0.5'}]
也可以对结果做for循环
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.find() for i in res: print(i)
执行输出:
{'_id': ObjectId('5b991895e125324a58178dd3'), 'name': '酸菜', 'price': '1'} {'_id': ObjectId('5b991895e125324a58178dd4'), 'name': '白菜', 'price': '2'} {'_id': ObjectId('5b991895e125324a58178dd5'), 'name': '小青菜', 'price': '0.5'}
查询单条
import pymongo # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.find_one() print(res)
由于_id是ObjectId对象,需要导入模块
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 # 插入多条数据 res = mongo_db.goods.find({"_id":ObjectId("5b991895e125324a58178dd5")}) for i in res: print(i)
# 插入多条数据 res = mongo_db.goods.insert_many([{"name" : "酸菜","price" : "1"},{"name" : "白菜","price" : "2"},{"name" : "小青菜","price" : "0.5"},])
执行输出:
{'_id': ObjectId('5b991895e125324a58178dd5'), 'name': '小青菜', 'price': '0.5'}
更新
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.update_one({"name":"小青菜"},{"$set":{"price":2}}) print(res)
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.update_one({"name":"小青菜"},{"$set":{"price":2}}) print(res)
执行输出:
<pymongo.results.UpdateResult object at 0x000001AF61E332C8> None
删除
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.delete_one({"name":"小青菜"}) print(res,res.raw_result)
执行输出:
<pymongo.results.DeleteResult object at 0x000001825B2134C8> {'n': 0, 'ok': 1.0}
排序
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.find({}).skip(1).limit(2) print(list(res))
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.find({}).skip(1).limit(2) print(list(res))
执行输出:
[{'_id': ObjectId('5b991895e125324a58178dd4'), 'name': '白菜', 'price': '2'}]
进阶
import pymongo from bson import ObjectId # 连接数据库 mclient = pymongo.MongoClient(host="127.0.0.1", port=27017) mongo_db = mclient["testdb"] # 切换数据库,不存在则创建 res = mongo_db.goods.find({}).sort("age",pymongo.DESCENDING)
#res = mongo_db.goods.find({}).sort("age",pymongo.DESCENDING).skip(1).limit(2)
print(list(res))
执行输出:
[{'_id': ObjectId('5b991895e125324a58178dd3'), 'name': '酸菜', 'price': '1'}, {'_id': ObjectId('5b991895e125324a58178dd4'), 'name': '白菜', 'price': '2'}]