Python操作Mongodb

Python Mongodb

Mongodb 是目前最流行的 NoSQL 数据库之一,使用的数据类型 BSON(类似 JSON)。

Pymongo

Python 要连接 MongoDB 需要 MongoDB 驱动,这里我们使用 PyMongo 驱动来连接。

Pymongo安装

Pip安装

pip 是一个通用的 Python 包管理工具,提供了对 Python 包的查找、下载、安装、卸载的功能。

pip3  install  pymongo

pycharm安装

    通过pycharm安装pymongo安装

PyMongo创建数据库

创建一个数据库

创建数据库需要使用 MongoClient 对象,并且指定连接的 URL 地址和要创建的数据库名。

实例: 创建数库(连接数据库)user_info

import pymongo

mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
USER_MONGO = mongo_client["user_info"]

注意:

在 MongoDB 中,数据库只有在内容插入后才会创建! 就是说,数据库创建后要创建集合(数据表)并插入一个文档(记录),数据库才会真正创建

判断数据库是否存在

可以读取 MongoDB 中的所有数据库,并判断指定的数据库是否存在

import pymongo

mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
USER_MONGO = mongo_client["user_info"]
# db_list 表示读取MongoDB 中的所有数据库
db_list =mongo_client.list_database_names()
# db_list = mongo_client.database_names()

# print(db_list)  # 拿到所有的MongoDB种的数据库
if "user_info" in db_list:
    print("数据库已经存在")
else:
    print("数据库不存在")

注意:

database_names 在最新版本的 Python 中已废弃,Python3.7+ 之后的版本改为了 list_database_names()。

PyMongo创建集合

MongoDB 中的集合类似 SQL 的表。

创建一个集合

MongoDB 使用数据库对象来创建集合

实例:

import pymongo

my_client = pymongo.MongoClient(host="127.0.0.1",port=27017)

# 获取MongoDB中的数据库 ,user_info数据库
my_db = my_client["user_info"]
# print(USER_MONGO)
my_watch = my_db["oldboy"] # 获取当前数据库中表

print(my_watch)

注意:

在 MongoDB 中,集合只有在内容插入后才会创建! 就是说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

判断集合是否已经存在

我们可以读取 MongoDB 数据库中的所有集合,并判断指定的集合是否存在:

import pymongo

my_client = pymongo.MongoClient(host="127.0.0.1",port=27017)

# 获取MongoDB中的数据库 ,user_info数据库
my_db = my_client["user_info"]
# print(USER_MONGO)
my_watch = my_db["oldboy"] # 获取当前数据库中对应的表
print(my_watch)

# 获取数据库中的所有的表
col_list = my_db.list_collection_names()
print(col_list)
if "user" in col_list:
    print("集合已经存在")

Python Mongodb文档查询

MongoDB 中使用了 find 和 find_one 方法来查询集合中的数据,它类似于 SQL 中的 SELECT 语句。

本文使用的此时数据:

db.user.insertMany([

    {name:"alex","age":20},

    {name:"wusir","age":21},

    {name:"fnb","age":22},

    {name:"zmc","age":23},

    {name:"hsj","age":24},

])

查询集合中所用数据

find() 方法可以查询集合中的所有数据,类似 SQL 中的 SELECT * 操作。

实例:

import pymongo
from collections import Iterator
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

res = my_col.find({})
#返回结果是True,表示res是一个生成器
print(isinstance(res, Iterator))
print(res,type(res))
for col in res:
    print(col) # 循环拿到每一条数据

输出结果:

{'_id': ObjectId('5c21c98b1e00b41aa84f3686'), 'name': 'alex', 'hobby': [2, 3, 4, '五', '六', 7, 8, 9], 'age': 20}

{'_id': ObjectId('5c21c98b1e00b41aa84f3687'), 'name': 'wusir', 'age': 21}

{'_id': ObjectId('5c21c98b1e00b41aa84f3688'), 'name': 'fnb', 'age': 22}

{'_id': ObjectId('5c21c98b1e00b41aa84f3689'), 'name': 'zmc', 'age': 23}

{'_id': ObjectId('5c21c98b1e00b41aa84f368a'), 'name': 'hsj', 'age': 24}

总结:

   find()  拿到的结果是一个生成器,可以for循环拿到每一个结果

查询一条语句

我们可以使用 find_one() 方法来查询集合中的一条数据。

实例:

import pymongo

mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

res = my_col.find_one({})
print(res,type(res),res.get("name"))

输出结果:

{'_id': ObjectId('5c21c98b1e00b41aa84f3686'), 'name': 'alex', 'hobby': [2, 3, 4, '五', '六', 7, 8, 9], 'age': 20}

<class 'dict'>

 Alex

总结:
由上面的输出结果可得出,find_one() 打印结果的类型是dict(字典)

根据执行的条件查询

特殊情况:

   使用find_one() 进行查询“_id” 这是个特殊情况

import pymongo
from bson import ObjectId  # 将数据类型转化成ObjectId类型
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

1.根据id=2的条件进行查询
res = my_col.find_one({"id":2})
2.将“_id”由ObjectId类型转化成字符串类型
res["_id"] = str(res["_id"])
# 如果直接将“_id”转化成字符串类型的数据,res_obj查询结果为None
# 如果直接将“_id”输入,res_obj会的得到查询的结果
# 总结 : “_id” 必须等于ObjectId类型的时候才能输出结果

在这中间部分可以执行序列化操作

# 此时“_id”是子浮串类型
# res_obj = my_col.find_one({"_id":res["_id"]})
3.通过导入的ObjectId将“_id”由子符串类型转化成ObjectId类型
res_obj = my_col.find_one({"_id":ObjectId(res["_id"])})
print(res_obj)


"_id" 的类型是一个 ObjectId 对象,对res进行序列化,会报错
# 应为res中存在“_id”,json不能对ObjectId类型的数据进行序列化
print(res.get("_id"),type(res.get("_id")),type(res))
import json
res_json = json.dumps(res)
print(res_json)

 

普通情况:

我们可以在 find() 中设置参数来过滤数据。

示例:

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

list里面是一个生成器,通过list将值取出来
注意:使用 $ 字符的时候一定加上引号
res = list(my_col.find({"$or":[{"name":"wusir"},{"age":24}]}))
print(res)

输出结果:

[

{'_id': ObjectId('5c21c98b1e00b41aa84f3687'), 'name': 'wusir', 'age': 21, 'id': 2},

 {'_id': ObjectId('5c21c98b1e00b41aa84f368a'), 'name': 'hsj', 'age': 24}

]

Python Mongodb插入(增加)文档

插入集合(一条数据)

集合中插入文档使用 insert_one() 方法,该方法的第一参数是字典 name => value 对。

示例:

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

res = my_col.insert_one({"name":"mwh","age":24})
print(res)
print(type(res))

输出结果:

<pymongo.results.InsertOneResult object at 0x0000017CA6CC8E08>

<class 'pymongo.results.InsertOneResult'>

总结:

插入一条数据的时候,给我返回的类型是InsertOneResult

插入多个文档(多条数据)

集合中插入多个文档使用 insert_many() 方法,该方法的第一参数是字典列表

示例:

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

my_list = [
    {"name":"wjw","age":18},
    {"name":"wwg","age":19},
    {"name":"kc","age":20},
]
res = my_col.insert_many(my_list)
print(res)
print(res.inserted_ids)

输出结果:

<pymongo.results.InsertManyResult object at 0x0000019DA5668E48>

[ObjectId('5c2223d5306ac52ca47de4cd'), ObjectId('5c2223d5306ac52ca47de4ce'), ObjectId('5c2223d5306ac52ca47de4cf')]

总结:

insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值。

Python Mongodb修改文档

MongoDB 中使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。

示例:

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

res = my_col.update_one({"name":"wusir"},{"$set":{"age":18,"name":"wusirdsb"}})
print(res)
print(dir(res))
print(res.raw_result)
print(type(res))

输出结果:

<pymongo.results.UpdateResult object at 0x00000274FF10BC88>

['_UpdateResult__acknowledged', '_UpdateResult__raw_result', '_WriteResult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'matched_count', 'modified_count', 'raw_result', 'upserted_id']

{'n': 0, 'nModified': 0, 'ok': 1.0, 'updatedExisting': False}

<class 'pymongo.results.UpdateResult'>

总结:

update_one() 方法只能修匹配到的第一条记录,输出的类型是UpdateResult'类型,如果要修改所有匹配到的记录,可以使用 update_many()。

Python Mongodb删除数据

我们可以使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

示例:

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

res = my_col.delete_one({"name":"alex"})
print(res)
print(dir(res))
print(res.raw_result)
print(type(res))

输出结果:
<pymongo.results.DeleteResult object at 0x0000024835DCDDC8>

['_DeleteResult__acknowledged', '_DeleteResult__raw_result', '_WriteResult__acknowledged', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__slots__', '__str__', '__subclasshook__', '_raise_if_unacknowledged', 'acknowledged', 'deleted_count', 'raw_result']

{'n': 1, 'ok': 1.0}

<class 'pymongo.results.DeleteResult'>

delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据。

注意:

     delete_one() 和 delete_many() 方法输出类型都是DeleteResult 类型

Python Mongo中的 limit,skip,sort

import pymongo
mongo_client = pymongo.MongoClient(host="127.0.0.1",port=27017)
my_db = mongo_client["user_info"]  # 拿到的是数据库
my_col = my_db["user"]  # 拿到的是数据库中一张表

# 选取
# res = list(my_col.find({}).limit(2))
# print(res)

# 跳过
# res = list(my_col.find({}).limit(2).skip(2))
# print(res)

# 排序
# res = list(my_col.find({}).sort({"age",1}))

# 在python中,排序不是使用1和-1,
# 正序使用:pymongo.ASCENDING
# 倒序使用:pymongo.DESCENDING
#正序
res = list(my_col.find({}).sort({"age",pymongo.ASCENDING}))
# 倒序
# res = list(my_col.find({}).sort({"age",pymongo.DESCENDING}))
print(res)

# 三个方法串联使用
res=list(my_col.find({}).sort("age",pymongo.ASCENDING).skip(2).limit(2))
print(res)

注意:

在python中   Sort + Skip + Limit 是有执行优先级的 他们的界别分别是 优先 Sort  其次 Skip 最后 Limt

Skip + Limit 的优先级 也是先 Skip 再 Limit

 

@font-face { font-family: 宋体; }@font-face { font-family: "Cambria Math"; }@font-face { font-family: 等线; }@font-face { font-family: 华文宋体; }@font-face { font-family: "等线 Light"; }@font-face { font-family: "@等线 Light"; }@font-face { font-family: "@等线"; }@font-face { font-family: "@宋体"; }@font-face { font-family: "@华文宋体"; }p.MsoNormal, li.MsoNormal, div.MsoNormal { margin: 0cm 0cm 0.0001pt; text-align: justify; font-size: 14pt; font-family: 等线; }h1 { margin: 17pt 0cm 16.5pt; text-align: justify; line-height: 240%; page-break-after: avoid; font-size: 22pt; font-family: 等线; }h2 { margin: 13pt 0cm; text-align: justify; line-height: 173%; page-break-after: avoid; font-size: 16pt; font-family: "等线 Light"; }pre { margin: 0cm 0cm 0.0001pt; font-size: 12pt; font-family: 宋体; }span.HTML { font-family: 宋体; }.MsoChpDefault { font-size: 14pt; font-family: 等线; }div.WordSection1 { }

posted @ 2018-12-26 08:33  小学弟-  阅读(1114)  评论(0编辑  收藏  举报