Mongdb:
https://www.cnblogs.com/DragonFire/p/9135630.html
MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center/community
准备:
启动Mongdb
mongdb --dbpath "数据库目录"
默认端口 27017
show dbs 查看当前存在磁盘上的数据库
show tables 查看当前数据库存在磁盘上的数据表
use 数据库 创建数据库或切换数据库
使用了不能存在的对象即创建该对象
数据库.表明 创建表
mongdb:
[
{"id":1,name:"jwb", "age": 12, "hobby":["fad",'fda']},
{"id":2,name:"jwb", "age": 33, "duixiang":{"id":2, "name": "alex", "age": 89}},
]
mysql: 数据库 表 列 row
mongdb: 数据库 collections Field documents
安装:nosqlboosterformongdb
数据增删改查:
https://www.cnblogs.com/DragonFire/p/9135638.html
show dbs 查看当前存在磁盘上的数据库
show tables 查看当前数据库存在磁盘上的数据表
use 数据库 创建数据库或切换数据库
db.user 创建表
db 查看当前数据库
---------------------------------------------------------------------------------------
# 增加
insert # 不推荐
db.user.insert({"id":1,name:"jwb", "age": 12}) #增加
insertOne # 官方推荐
db.user.insertOne({"name":"dd","age":21})
{
"acknowledged" : true,
"insertedId" : ObjectId("5e1d2fd77d4a5d11d2853baa")
}
inserMany # 官方推荐
--------------------------------------------------------------------------------------
# 查询
find # 直接查询全部
findOne # 查询其中的一条
find() 无条件查找:将该表(Collection)中所有的数据一次性返回
> db.user.find({},{"_id":0})
{ "name" : "huahua", "age" : 20 }
{ "name" : "dd", "age" : 21 }
{ "name" : "dt", "age" : 21 }
{ "name" : "ceshi", "age" : 22 }
> db.user.findOne({"name":"dd"},{"_id":0})
{ "name" : "dd", "age" : 21 }
findOne()无条件查找一条数据,默认当前Collection中的第一条数据
findOne({age:19}) : 条件查找一条age等于19的数据,如有多条数据则返回更靠前的数据
--------------------------------------------------------------------------------------
# 修改
update # 不推荐
> db.user.update({"name":"dd"},{$set:{"age":19}})
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 匹配一条,插入零条,修改一条
updateOne # 官方推荐
updateOne({"age":19},{$set:{"name":"WSSB"}}) # 根据条件修改一条数据的内容,如出现多条,只修改最高前的数据
updateMany # 官方推荐
updateMany({"age":19},{$set:{"name":"pig_qi"}}) # 根据条件修改所有数据的内容,多条修改
--------------------------------------------------------------------------------------
# 删除
remove({}) # 无条件删除数据,这里要注意了,这是删除所有数据,清空Collection
> db.user.remove({"id":"1"})
WriteResult({ "nRemoved" : 1 })
--------------------------------------------------------------------------------------
db.user.find() # 查看数据
# { "_id" : ObjectId("5e1c29654b4190261d2230c3"), "id" : 1, "name" : "alex" }
db.user.find({}).skip(2).limit(5)
Mongodb中的跳过选取排序:
skip(5) 跳过五条数据
limit(5) 只显示五条数据
分页 skip(5).limit(5)
sort({age:1}) 正序
sort({age:-1}) 逆序
如果三个关键字同时出现:
1.sort 2.skip 3.limit
数据类型:
https://www.cnblogs.com/DragonFire/p/9135854.html
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类型,时间戳可以秒杀一切时间类型)
mongodb关键字:
1.查询中常见的 等于 大于 小于 大于等于 小于等于
# 等于 : 在MongoDB中什么字段等于什么值其实就是 " : " 来搞定 比如 "name" : "路飞学城"
> db.user.find({"age":21})
# 大于 : 在MongoDB中的 大于 > 号 我们用 : $gt 比如 : "score" : { $gt : 80 } 就是 得到 "score" 大于 80 的数据
> db.user.find({"age":{"$gt":20}},{"_id":0})
{ "name" : "dt", "age" : 21 }
{ "name" : "ceshi", "age" : 22 }
# 小于 : 在MongoDB中的 小于 < 号 我们用 : $lt 比如 : "score" : { $lt : 80 } 就是 得到 "score" 小于 80 的数据
> db.user.find({"age":{"$lt":20}},{"_id":0})
{ "name" : "dd", "age" : 19 }
# 大于等于 : 在MongoDB中的 大于等于 >= 号 我们用 : $gte 比如 : "score" : { $gte : 80 } 就是 得到 "score" 大于等于 80 的数据
> db.user.find({"age":{"$gte":20}},{"_id":0})
{ "name" : "huahua", "age" : 20 }
{ "name" : "dt", "age" : 21 }
# 小于等于 : 在MongoDB中的 小于等于 <= 号 我们用 : $lte 比如 : "score" : { $lte : 80 } 就是 得到 "score" 小于等于 80 的数据
> db.user.find({"age":{"$lte":20}},{"_id":0})
{ "name" : "huahua", "age" : 20 }
{ "name" : "dd", "age" : 19 }
----------------------------------------------------------------------------------------
2.MongoDB中的那些个update修改器: $inc $set $unset $push $pull
# $inc : Python中的 变量 += 1 , 将查询到的结果 加上某一个值 然后保存
> db.user.update({"name":"dd"},{$inc:{"age":1}},{"_id":0}) # age+1
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.user.find({"name":"dd"})
{ "_id" : ObjectId("5e1d2fd77d4a5d11d2853baa"), "name" : "dd", "age" : 20 }
减操作如何进行呢,加负的就是减
> db.user.update({"name":"dd"},{$inc:{"age":-1}},{"_id":0})
# $set : 此前我们已经提到过 $set 的用法和特性(没有就自动添加一条)了
> db.user.update({"name":"dd"},{$set:{"sex": "femail"}})
# $unset : 用来删除Key(field)的
删除对应数据的属性,{"sex":"femail"}可以写全,也可以不写全
> db.user.update({"name":"dd"},{$unset:{"sex":""}})
# $push : 它是用来对Array (list)数据类型进行 增加 新元素的,相当于我们大Python中 list.append() 方法
> db.user.update({name:"dd"},{$set:{hobby:[1,2,3,4,5]}})
> db.user.update({name:"dd"},{$push:{hobby:6}})
> db.user.update({name:"dd"},{$push:{hobby:[6]}})
{ "name" : "dd", "age" : 19, "hobby" : [ 1, 2, 3, 4, 5, [ 6 ], 6 ] }
这里push进入是什么类型就是什么类型
# $pull : 有了$push 对Array类型进行增加,就一定有办法对其内部进行删减,$pull 就是指定删除Array中的某一个元素
db.user.update({name:"dd"},{$pull:{hobby:6}})
db.user.update({name:"dd"},{$pull:{hobby:[6]}})
{ "name" : "dd", "age" : 19, "hobby" : [ 1, 2, 3, 4, 5 ] }
如果有多个同种类型的相同的值,会都被删除,
# $pop : 指定删除Array中的第一个 或 最后一个 元素
db.user.update({name:"dd"},{$pop:{hobby:1}}) # 删除最后一个
db.user.update({name:"dd"},{$pop:{hobby:-1}}) # 删除第一个
特殊用法:
# 还有关于mongodb中的除了bool,flaot,int,如果他是个字符串,你就把双引号加上,字段名也一样,有时候会出现各种报错
> db.user.find({name:"dd"},{"_id":0})
{ "name" : "dd", "age" : 19, "hobby" : [ 2, 3, 4 ] }
> db.user.update({name:"dd"},{$set:{"hobby.0":9}}) #
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 将下标第一个设置为9
db.user.insert({"name":"alex","hobby":[1,2,3,4,6],"girl":["make","jj","pyyu"]})
db.user.update({"name":"alex"},{$set:{"hobby.2":100}}) # 将第三个值改为100
db.user.update({"name":"alex","hobby.1":{$lt:10}},{$inc:{"hobby.1":100}}) # 如果小于10,就加100
db.user.updateOne({"name":"alex","hobby":{$lt:100}},{$inc:{"hobby.$":1}}) # 给小于100的加上1
db.user.updateMany({"name":"alex","hobby":{$lt:100}},{$inc:{"hobby.$":1}}) # many只改第一个,需要改全部自己全部获取出来之后,重新赋值加进去
db.user.update({"name":"alex"},{$set:{"girl.100":"bobo"}}) # 下标取值,赋值设置,但是如果没有值话就是创建,比如你没有下标100,girl.100,中间的下标会使用null补齐。
db.user.update({name:"alex"},{$pull:{girl:"bobo"}})
db.user.insert({name:"alex",price:[
{"start":"2018-10-1",start_time:"8:30","count":100},
{"start":"2019-12-10",start_time:"12:30","count":300},
{"start":"2022-2-11",start_time:"1:30","count":500},
]})
1.给count小于350的加15,这的这个price.$.count代表的意思是,前面过滤条件之后的结果,也就是这个东西:
db.user.insert({name:"alex",price:[
{"start":"2018-10-1",start_time:"8:30","count":100},
{"start":"2019-12-10",start_time:"12:30","count":300},
]})
> db.user.update({"name":"alex","price.count":{$lt:350}},{$inc:{"price.$.count":15}})
2.把 count 大于 180 的 start 改为 "2018-8-10"
db.user.update({"name":"alex","price.count":{$gt:300}},{$set:{"price.$.start":"2018-8-10"}})
limit,skip,sort用法:
limit:
db.user.find({}).limit(3) # 拿出几条
skip:
db.user.find({}).skip(3) # 跳过几条
sort:
db.user.find({}).sort({"age":1}) # 1升序,-1降序
# Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort 其次 Skip 最后 Limt
pymongo:
import pymongo as pymongo
import json
from bson import ObjectId
mongoclient = pymongo.MongoClient(host="127.0.0.1", port=27017)
Mongodb = mongoclient["user"]
# res = Mongodb.user.find({})
#
# for i in res:
# i["_id"] = str(i["_id"])
# print(json.dumps(i))
# 查找
# res = Mongodb.user.find_one({}, {"_id": 0})
# print(res)
# 插入
# res = Mongodb.user.insert_one({"id": 4, "name": "bobo"})
# print(res, type(res), res.inserted_id)
# res = Mongodb.user.insert_many([{"id": 6, "name": "tete"}, {"id": 5, "name": "bati"}])
# print(res, type(res), res.inserted_ids)
# 修改
# res = Mongodb.user.update_one({'id': 4}, {"$set": {"name": "四氟垫"}})
# print(res, type(res))
#
# res = Mongodb.user.update_many({'id': 4}, {"$set": {"name": "四氟垫"}})
# print(res, type(res))
# res = Mongodb.user.find({"id": 1})
# print(res[0])
# 删除
# res = Mongodb.user.delete_one({"id": 1})
# res = Mongodb.user.delete_many({"id": 1})
# limit sort skip
# res = list(Mongodb.user.find({}).limit(5).skip(2))
# print(res)
# res = list(Mongodb.user.find({}).sort("age", pymongo.DESCENDING).limit(5).skip(2))
# print(res)
#
# s = ObjectId("5e1c3031e9c14a7efc87efb1") # 字符串转换为,ObjectId
# data = Mongodb.user.find_one({"_id": s})
# print(data)
user = {
"1": "alex",
"2": "make"
}
chat_list = []
while True:
user_id = input("请输入用户id:")
string = input("请输入内容:")
user_name = user.get(user_id)
if string.strip():
user_dict = {user_name: string}
chat_list.append(user_dict)
chat_list = json.dumps(chat_list)
if not Mongodb.user.find_one({"id": user_id}):
Mongodb.user.insert_one({"id": user_id, "chat_list": chat_list})
else:
print("update")
Mongodb.user.update_one({"id": user_id}, {"$set": {"chat_list": chat_list}})
chat_list = json.loads(chat_list)
回顾:
https://www.cnblogs.com/DragonFire/p/9141976.html
MongoDB:
mongod 启动 --dbpath 数据存储路径
use dbname 切换或者创建数据库
db.tablename 创建或切换当前表 -Collection
增:
不推荐
db.tablename.insert([{}],{})
db.tablename.insertOne({})
db.tablename.insertMany([{}],{})
删:
remove({})
官方推荐:
db.tablename.deleteOne({条件}) # 删除符合条件的一条
db.tablename.deleteMany({条件}) # 删除符合条件的多条
-----------------------------------------------------------------------------------------
改: $set
db.tablename.update({条件}, {$set:{field:value}})
官方推荐
updateOne({条件}, {$set:{field:value}})
updateMany({条件}, {$set:{field:value}})
修改器
$set 暴力修改
$unset 暴力删除
$inc +1 +-1 引用增加
array 修改器
$push 追加 list中的append 追加数据,追后追加 updateOne({score:100}, {$push:{list_field:1}})
$pull 追加 list中的remove 删除某元素 updateOne({score:100}, {$pull:{list_field:1}})
$pushAll 追加 list中的extends 迭代追加最后追加数据 updateOne({条件}, {$push:{list_field:[1,2,3]}})
$pop 追加 list中的pop 删除第一个或最后一个元素 updateOne({score:100}, {$pop:{field_list:6}}) /updateOne({条件}, {$pop:{list_field:1}})
$ - 符合条件的下标 -array中
[1,2,5,21,7,1] $=2
updateOne({score:100}, {$set:{list.$:1000}})
# 存储符合条件元素的下标索引,只能存放一个下标 - 只能存放符合条件第一个
-----------------------------------------------------------------------------------------
查
find({})
并列条件
find({name:"1, "age":2})
或条件 - 不容的字段的或
$or findOne({$or:[{"name:"1"},{"age": 12}]})
子集 位置可以发生变化
$in findOne({"age":{$in:[12,34,54]}})
完全符合 位置可以发生变化
$all findOne({"age":{$all:[12,34,54]}})
-----------------------------------------------------------------------------------------
sort limit skip
find({"age":{$all:[1,2,3,4]}}).sort({"key":-1})
find({"age":{$all:[1,2,3,4]}}).limit(5) # 显示当前位置向下5条数据
find({"age":{$all:[1,2,3,4]}}).skip(5) # 跳过5调数据,作为当前位置
优先级
find({"age":{$all:[1,2,3,4]}}).sort({"key":-1}).skip(5).limit(5)
-----------------------------------------------------------------------------------------
pymongo
find() # 对可以迭代的
findOne() = find_one #字典
update_many()
res = insert_one # 去当前插入数据的——id res.inserted_id
res = insert_many # 去当前插入数据的——id res.inserted_ids
pymongo排序 sort(key,pymongo.DESCENDING = -1)
pymongo排序 sort(key,pymongo.AESCENDING = 1)
-----------------------------------------------------------------------------------------
windows安装问题:
D:ProgramFilesBianChengmongodb-win32-x86_64-2008plus-ssl-4.0.4>mongo
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017
2018-11-19T17:51:37.147+0800 E QUERY [js] Error: couldn't connect to server 127.0.0.1:27017, connection attempt failed: SocketException: Error connecting to 127.0.0.1:27017 :: caused by :: ����Ŀ�����������ܾ������� �ӡ� :
connect@src/mongo/shell/mongo.js:257:13
@(connect):1:6
exception: connect failed
稀里哗啦一大堆错误。
解决办法:
1.
mongod 查看一下,他报的,找不到一个文件夹/data/db/
2020-01-08T17:48:15.317+0800 I CONTROL [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] MongoDB starting : pid=17960 port=27017 dbpath=C:datadb 64-bit host=DESKTOP-LTGANIS
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] db version v4.0.14
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] git version: 1622021384533dade8b3c89ed3ecd80e1142c132
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] allocator: tcmalloc
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] modules: none
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] build environment:
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] distmod: 2008plus-ssl
2020-01-08T17:48:15.321+0800 I CONTROL [initandlisten] distarch: x86_64
2020-01-08T17:48:15.322+0800 I CONTROL [initandlisten] target_arch: x86_64
2020-01-08T17:48:15.322+0800 I CONTROL [initandlisten] options: {}
2020-01-08T17:48:15.325+0800 I STORAGE [initandlisten] exception in initAndListen: NonExistentPath: Data directory C:datadb not found., terminating # 这里看到了我能认识的文字了,找不到文件夹
2020-01-08T17:48:15.325+0800 I NETWORK [initandlisten] shutdown: going to close listening sockets...
2020-01-08T17:48:15.325+0800 I CONTROL [initandlisten] now exiting
2020-01-08T17:48:15.325+0800 I CONTROL [initandlisten] shutting down with code:100
2.
cd D:mongdbdata
mkdir db # 创建文件夹
3.
在cmd输入mongod.exe --dbpath D:mongdbdatadb
D:mongdbdatadb 代表你的要存放的位置,这里是我的位置,你要事先把这个文件夹建立好,不然要报错
此时,这个cmd窗口不要关闭,再次打开一个新的cmd窗口输入mongo命令:mongo如果进去了就好了
总结:其实就是socket连接不上,而且mongodb数据没地方存储,所以初始化一个存储数据的文件夹,第二步的命令就是