MongoDB在python中的使用

MongoDB在python中的使用

文章目录

  • MongoDB在python中的使用
    • 安装
      • 配置文件
    • 客户端
    • Pychar插件
    • Python链接
    • Mongodb基本使用
      • 基本概念
      • 插入数据
        • ObjectID
        • 文档
      • 查询数据
      • 统计
      • 排序
      • 分页
      • 更新
      • 删除

  • mongoDB是由C++编写的分布式文档数据库。

  • 内部使用类似于Json的bson格式。

  • 中文手册https://www.w3cschool.cn/mongodb/

安装

  • https://www.mongodb.com/download-center/communitywindows下载官方zip,解压即可使用。
组件 文件名
Server mongod.exe
Router mongos.exe
Client mongo.exe
MonitoringTools mongostat.exe,mongotop.exe
importExportTools mongodump.exe,mongorestore.exe,mongoexport.exe,mongoimport.exe
MiscellaneousTools bsondump.exe,mongofiles.exe,mongooplog.exe,mongoperf.exe
  • 运行
$ pwd
/d/Application/mogodb/package/mongodb4.0/bin
gdy@gdy MINGW64 /d/Application/mogodb/package/mongodb4.0/bin
$ ./mongod.exe
2019-08-13T22:01:34.963+0800 I STORAGE  [main] Max cache overflow file size custom option: 0
2019-08-13T22:01:35.408+0800 I CONTROL  [main] Automatically disabling TLS 1.0, to force-enable TLS 1.0 specify --sslDisabledProtocols 'none'
2019-08-13T22:01:35.412+0800 I CONTROL  [initandlisten] MongoDB starting : pid=20852 port=27017 dbpath=D:\data\db\ 64-bit host=gdy
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/Windows Server 2008 R2
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] db version v4.0.12
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] git version: 5776e3cbf9e7afe86e6b29e22520ffb6766e95d4
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] allocator: tcmalloc
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] modules: none
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] build environment:
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten]     distmod: 2008plus-ssl
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten]     distarch: x86_64
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten]     target_arch: x86_64
2019-08-13T22:01:35.413+0800 I CONTROL  [initandlisten] options: {}
2019-08-13T22:01:35.434+0800 I STORAGE  [initandlisten] exception in initAndListen: NonExistentPath: Data directory D:\data\db\ not found., terminating
2019-08-13T22:01:35.434+0800 I NETWORK  [initandlisten] shutdown: going to close listening sockets...
2019-08-13T22:01:35.434+0800 I CONTROL  [initandlisten] now exiting
2019-08-13T22:01:35.434+0800 I CONTROL  [initandlisten] shutting down with code:100

gdy@gdy MINGW64 /d/Application/mogodb/package/mongodb4.0/bin
$
  • 启动服务出错,原因在于找不到数据目录。windows下创建该目录D:\data\db\
  • 选项说明
    1. --bind_ip ip逗号分隔ip地址。默认localhost
    2. --bing_ip_all绑定所有本地ip地址
    3. --port port端口,默认27017
    4. --dbpath path数据路径,缺省为\data\db\。windows下缺省就是当前盘符的根目录
    5. --logpath path指定日志文件,替代stdout,说明默认是控制台打印日志
    6. -f file指定配置文件,yaml格式
    7. 注册wiendows服务
      • –install 注册windwos服务
      • –serviceName name 服务名称
      • –serviceDisplayName name 服务显示名

配置文件

  • mongodb配置使用YAML格式

  • 嵌套使用缩进晚餐,不支持Tab等制表符,支持空格

  • 冒号后要有空格

  • Yaml参考https://www.w3cschool.cn/iqmrhf/dotvpozt.html

  • 配置mongoing.com/docs/reference/configuration-options.html

  • 在mongodb安装目录新建配置文件mongodb.yml。内容如下:

systemLog:
   destination: file
   path: "D:/Application/mogodb/package/mongodb4.0/mongod.log"
   logAppend: true
storage:
   dbPath: "D:/Application/mogodb/package/mongodb4.0/db"
net:
   bindIp: 127.0.0.1
   port: 27017
  1. 在对应目录建立D:/Application/mogodb/package/mongodb4.0/db文件夹
  • 选项

    1. systemLog
      • destination,缺省是输出日志到std,file表示输出到文件
      • path,日志路径
      • logAppend,true表示在已存在的日志文件追加。默认false,每次启动服务,重新创建新的日志。
    2. storage
      • dbPath,必须指定,mongodb的数据目录
    3. net
      • bindlp,缺省绑定到127.0.0.1
      • port,端口,缺省为27017,客户端连接用
  • windows下注册为服务的命令如下,使用了配置文件:

    1. mongod.exe -f "D:/Application/mogodb/package/mongodb4.0/mongod.yml" --serviceName mongod --serviceDisplayName mongo --install
  • 去掉配置文件中的配置日志信息部分。这样日志将会显示在控制台

storage:
   dbPath: "D:/Application/mogodb/package/mongodb4.0/db"
net:
   bindIp: 127.0.0.1
   port: 27017
  • 控制台执行命令为:
$ pwd
/d/Application/mogodb/package/mongodb4.0/bin

gdy@gdy MINGW64 /d/Application/mogodb/package/mongodb4.0/bin
$ ./mongod.exe -f ../mongodb.yml

客户端

  • 客户端连接
$ bin/mongo.exe
MongoDB shell version v4.0.12
help 打开帮助
show dbs    查看当前库
use blog    有就切换过去,没有就创建后切换过去。刚创建的并不在数据库列表中,需要写入数据后才能看到
db          查看当前数据库
db.users.insert({user:"tom",age:20}) db指代当前数据库;users集合名

Pychar插件

  • 在settings/plugins中输入mongo,安装Mongo Plugin,完成后重启Pycharm。
  • 菜单项view/Tool windows/Mongo Explorer

Python链接

  • Mongodb官方推荐使用pymongo。参考https://docs.mongodb.com/ecosystem/drivers/pymongo/
  • 本次Mongodb使用的是3.6,需要pymongo 3.6以上。缺省安装pymongo 3.8,目前兼容Python 3.4+。
  • mongodb的链接字符串mongodb://gdy:[email protected]:27017/test
from pymongo import MongoClient

# client = MongoClient(host="127.0.0.1",port=27017) #客户端连接
client = MongoClient("mongodb://127.0.0.1:27017")
print(client)

# db = client.blog
db = client["blog"] #指定数据库
print(db)

# users = db["users"]
users = db.users #集合
print(users)

Mongodb基本使用

基本概念

  • MongoDB中可以创建使用多个库,但有一些数据库名是保留的,可以直接访问这些特殊作用的数据库。
    1. admin:从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
    2. local:这个数据永远不会被赋值,可以用来存储限于本地单台服务器的任意集合
    3. config:当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
MongoDB RDBMS
Database Database
Table Collection
Row Document
Column Field
Join Embedded Document嵌入文档或Reference引用
Primary Key 主键(MongoDB提供了Key为_id)

插入数据

  • 每条数据插入后都有一个唯一key,属性_id唯一标识一个文档。没有没有显示指明该属性,会自动生成一个Objectld类型的_id属性。
  • pymongo.collection.Collection类
    1. db.collection.insert_one(dict)->InsertOneResult #单行插入
      • dict是一个字典
      • InsertOneResult:f返回结果ObjectId对象,即_id的值
    2. db.collection.insert_many([dict,…])->[InsertOneResult,…] #多行插入
      • 第一个参数是个列表,列表中记录需要插入的文档类型即dict
      • 返回结果,被插入的对象所获得的id
from pymongo import MongoClient
from pymongo.results import InsertOneResult
from pymongo.collection import Collection

# client = MongoClient(host="127.0.0.1",port=27017) #客户端连接
client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

user1 = {"id":1,"name":"ben","age":20}
# users.insert(user1) #已经过期
#单条插入
x:InsertOneResult = users.insert_one(user1)
print(type(x),x)
print(x.inserted_id)

user2 = {"id":257,"name":"tom","age":32}
user3 = {"id":258,"name":"jerry","age":18}

#批量插入
result = users.insert_many([user2,user3])
print(result.inserted_ids)
#[ObjectId('5d539433c1b3dcb23654814d'), ObjectId('5d539433c1b3dcb23654814e')]

#大小写敏感
user4 = {"id":"3","name":"tom","age":20,"Name":"tommy"}
x = users.insert_one(user4)
print(x.inserted_id)

MongoDB在python中的使用_第1张图片

  • 插入后的数

MongoDB在python中的使用_第2张图片

ObjectID

  • ObjectID由12个字节组成

    1. 4个字节时间戳
    2. 3个字节机器识别码
    3. 2个字节进程id
    4. 3个字节随机数
  • 根据上面的objectID(5d539433c1b3dcb23654814d)验证

import datetime

t = "5d539433c1b3dcb23654814d"[:8] #时间戳提取
print(t)
x = int.from_bytes(bytearray.fromhex(t),"big")
print(hex(x),x)
print(datetime.datetime.fromtimestamp(x))

# 也可以使用函数获取
import bson
dat = bson.ObjectId("5d539433c1b3dcb23654814d").generation_time
print(dat,dat.timestamp())

MongoDB在python中的使用_第3张图片

文档

  • mongodb数据类型参考https://docs.mongodb.com/v3.6/reference/bson-types/
  • 每一条记录对应一个文档,其格式使用BSON。BSON即Binary Json。
  • BSON二进制格式如下:
    1. 可以查看"D:\Application\mogodb\package\mongodb4.0\db\collection-4-*.wt"对应的二进制格式

MongoDB在python中的使用_第4张图片

  1. 00 00 05 82 d7 35 00 00 00 07 5f 69 64 00 5d 45
    • 35 表示文档二精制数据长度
    • 07 表示MongoDB中特殊数据类型ObjectID
    • 5f 69 64 ,ascii码_id
  2. 57 be 12 f2 bf 14 48 c7 43 de 10 69 64 00 01 01
    • 5d 45 57 be 12 f2 bf 14 48 c7 43 de,ObjectId(‘5d4557be12f2bf1448c743de’)_id的值
    • 10 69 64,10表示类型int-32,69 64是ascii码id
    • 0101小端模式,十进制257
  3. 00 00 02 6e 61 6d 65 00 04 00 00 00 74 6f 6d 00
    • 02表示数据类型UTF-8 String
    • 6e 61 6d 65表示字符串name
    • 04,表示字符串长度
    • 74 6f 6d 00,表示字符串tom和结束符
  4. 10 61 67 65 00 20 00
    • 10,表示数据类型int-32
    • 61 67 65,表示字符串age
    • 20,表示十进制32
  • 文档
    1. 文档中,使用键值对
    2. 文档中的键/值对时有序
    3. 键是字符串
      • 区分大小写,使用UTF-8字符
      • 键不能含有\0(空字符)。这个字符用来表示键字符串的结尾
      • .$有特别的意义,只有在特定环境下才能使用
      • 以下划线_开头的键是保留的,例如:_id
    4. 值可以是:
      • 字符串,32位或64位整数、双精度、时间戳(毫秒)、布尔型、null
      • 字节数组、BSON数组、BSON对象

查询数据

  • pymongo.collection.Collection类
  1. db.collection.find_one(dict)->result 查询单条数据
  2. db.collection.find(dict)->resutl 查询多条数据
    • dict,使用查询操作符组成的字典
    • result,返回的结果集
  • 单条查询
from pymongo import MongoClient
from pymongo.collection import Collection
from bson.objectid import ObjectId

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

# 查询
result = users.find_one({"name":"tom"})
print(type(result),result)

# 使用key查询
result2 = users.find_one({"_id":ObjectId("5d539433c1b3dcb23654814d")})
print(type(result2),result2)

#查不到,返回None
result3 = users.find_one({"name":"tommy"})
print(type(result3),result3)

MongoDB在python中的使用_第5张图片

  • 多条查询
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

# 多条查询
results = users.find({"name":"tom"})
print(type(results))
print(results)

print("- "*30)
for x in results:
    print(type(x),x)

MongoDB在python中的使用_第6张图片

  • 查询操作符
比较符号 含义 示例
$lt 小于 {"age":{"$lt":20}}
$gt 大于 {"age":{"$gt":20}}
$lte 小于等于 {"age":{"$lte":20}}
$gte 大于等于 {"age":{"$gte":20}}
$ne 不等于 {"age":{"$ne":20}}
$eq 等于,可以不用增符号 {"age":{"$eq":20}}
$in 在范围内 {"age":{"$in":[20,23]}}
$nin 不在范围内 {"age":{"$nin":[20,30]]}}
逻辑符号 含义 示例
$and {"$and":[{"name":"tom"},{"age":{"$gt":20}}]}
$or
$not
元素 含义 示例
$regex 文档中字段内容匹配 {"name":{"$regex":"^t"}}
$mod 取模 {"age":{"$mod":[10,2]}}模10余2

统计

  1. db.collection.find(条件字典).count() 统计次数(已过时)
  2. db.collection.count_documents(条件字典)
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

# 统计
# 被弃用
# count = users.find({"age":{"$gt":10}}).count()

#求出age>10的数量
count = users.count_documents({"age":{"$gt":10}})
print(count) #返回结果4

排序

  1. db.collection.find().sort(字段名,排序规则)
  2. db.collection.find().sort(list)
    • list为一个列表,封装多个排序规则的2元组,2元组第一个参数为字段名,第二个参数为排序规则
from pymongo import MongoClient
from pymongo.collection import Collection
import pymongo

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

# 排序
results = users.find().sort("age",pymongo.DESCENDING) #降序
print(*list(results),sep="\n")
print("- "*30)

results2 = users.find().sort(
    [
        ("name",pymongo.DESCENDING),#name降序排列
        ("age",pymongo.ASCENDING) #age升序
    ]
)

print(*list(results2),sep="\n")

MongoDB在python中的使用_第7张图片

分页

  1. db.collection.find().skip(n).limit(m) #分页,查询结果中跳过前n个,最多显示m个
    • skip(n):从查询结果中跳过前面指定n个
    • limit(m):从查询结果中最多只显示m个
  2. skip跳过几个,limit限制结果个数
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

# 分页
results = users.find()
print(*list(results),sep="\n")
print("- "*30)

results1 = users.find().skip(2) #跳过前2个
print(*list(results1),sep="\n")
print("- "*30)

results2 = users.find().skip(1).limit(2) #跳过前1个最多显示2个
print(*list(results2),sep="\n")
print("- "*30)

MongoDB在python中的使用_第8张图片

更新

更新操作符 含义 示例
$inc 对给定字段数字值增减 {"$inc":{"age":-5}}
对age的值-5
$set 设置字段值,如果字段不存在则创建 {"$set":{"gender":"M"}}
$unset 移除字段 {"$unset":{"Name":""}}
  • db.collection.updateOne(查询条件dict,更新dict)方法只更新查询结果集中的第一个
  • db.collection.update_many(查询条件dict,更新dict)方法多行更新
  • db.collection.replace_one(查询条件,新文档dict) 更新一个文档,会将匹配到的第一个结果中的文档替换为新文档。
    1. 替换文档,更新除_id外的所有字段
  1. updateOne更新第一个示例
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

print(*list(users.find()),sep="\n")
print("- "*30)

# 更新,将name为tom的结果中第一行文档中age增加5
result = users.update_one({"name":"tom"},{"$inc":{"age":5}})
print(type(result),result)
print(result.matched_count,result.modified_count)

print("- "*30)
print(*list(users.find()),sep="\n")

MongoDB在python中的使用_第9张图片

  1. update_many更新多行
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

print(*list(users.find()),sep="\n")
print("- "*30)

# 更新,将name为tom的字段都添加一个gender等于m的属性
result = users.update_many({"name":"tom"},{"$set":{"gender":"M"}})
print(type(result),result)
print(result.matched_count,result.modified_count)

print("- "*30)
print(*list(users.find()),sep="\n")
print("- "*30)

# 更新,将有name为tom的文档中包含Name属性的删除
result = users.update_many({"name":"tom"},{"$unset":{"Name":""}})
print(type(result),result)
print(result.matched_count,result.modified_count)

print("- "*30)
print(*list(users.find()),sep="\n")

MongoDB在python中的使用_第10张图片

  1. replace_one替换一个文档
    • 更新除_id字段外的所有字段
from pymongo import MongoClient
from pymongo.collection import Collection

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

print(*list(users.find()),sep="\n")
print("- "*30)

# 替换文档
result = users.replace_one({"name":"tom"},{"id":200,"name":"sam"})
print(type(result),result)

print("- "*30)
print(*list(users.find()),sep="\n")

MongoDB在python中的使用_第11张图片

删除

  • db.collection.remove(条件dict) #删除,已过时的方法
  • db.collection.delete_one(条件dict) #将满足条件的结果删除第一行
  • db.collection.delete_many(条件dict)#将满足条件的结果全部删除
    1. db.collection.delete_many({})删除所有文档,慎用
from pymongo import MongoClient
from pymongo.collection import Collection
from pymongo.results import DeleteResult

client = MongoClient("mongodb://127.0.0.1:27017")
db = client["blog"] #指定数据库
users:Collection = db.users #集合

print(*list(users.find()),sep="\n")
print("- "*30)

# 删除age为20的文档,只删除一条
result:DeleteResult = users.delete_one({"age":20})
print(type(result),result.deleted_count)

print("- "*30)
print(*list(users.find()),sep="\n")

# 删除所有存在age字段的文档
result2:DeleteResult = users.delete_many({"age":{"$exists":True}})
print(type(result2),result2.deleted_count)

print("- "*30)
print(*list(users.find()),sep="\n")

MongoDB在python中的使用_第12张图片

你可能感兴趣的:(python基本知识)