pymongo 操作

2019/03/05 17:09
阅读数 90

python 操作 mongoDB

模块

pymongo

安装方法

sudo pip3 install pymongo

操作步骤

1. 创建数据库连接对象

conn = pymonge.MomgoClient("localhost",27017)

2. 生成操作的数据库对象

db = conn.stu

3. 生成集合对象

myset = db.class0

4. 通过 集合对象 调用结构完成数据操作

['_BaseObject__codec_options',
 '_BaseObject__read_concern',
 '_BaseObject__read_preference',
 '_BaseObject__write_concern',
 '_Collection__create',
 '_Collection__create_index',
 '_Collection__database',
 '_Collection__find_and_modify',
 '_Collection__full_name',
 '_Collection__name',
 '_Collection__write_response_codec_options',
 '__call__',
 '__class__',
 '__delattr__',
 '__dict__',
 '__dir__',
 '__doc__',
 '__eq__',
 '__format__',
 '__ge__',
 '__getattr__',
 '__getattribute__',
 '__getitem__',
 '__gt__',
 '__hash__',
 '__init__',
 '__iter__',
 '__le__',
 '__lt__',
 '__module__',
 '__ne__',
 '__new__',
 '__next__',
 '__reduce__',
 '__reduce_ex__',
 '__repr__',
 '__setattr__',
 '__sizeof__',
 '__str__',
 '__subclasshook__',
 '__weakref__',
 '_command',
 '_count',
 '_delete',
 '_insert',
 '_insert_one',
 '_legacy_write',
 '_socket_for_primary_reads',
 '_socket_for_reads',
 '_socket_for_writes',
 '_update',
 'aggregate',
 'bulk_write',
 'codec_options',
 'count',
 'create_index',
 'create_indexes',
 'database',
 'delete_many',
 'delete_one',
 'distinct',
 'drop',
 'drop_index',
 'drop_indexes',
 'ensure_index',
 'find',
 'find_and_modify',
 'find_one',
 'find_one_and_delete',
 'find_one_and_replace',
 'find_one_and_update',
 'full_name',
 'group',
 'index_information',
 'initialize_ordered_bulk_op',
 'initialize_unordered_bulk_op',
 'inline_map_reduce',
 'insert',
 'insert_many',
 'insert_one',
 'list_indexes',
 'map_reduce',
 'name',
 'next',
 'options',
 'parallel_scan',
 'read_concern',
 'read_preference',
 'reindex',
 'remove',
 'rename',
 'replace_one',
 'save',
 'update',
 'update_many',
 'update_one',
 'with_options',
 'write_concern']
集合对象内的所有方法

5. 关闭数据库连接

db.close()

数据操作

插入文档

insert_many     插入多条
insert_one      插入一条
insert          插入一条或多条
save            保存文档

实例

myset.insert_one({"name":"张铁林","King":"乾隆"})
myset.insert_many([{
"name":"张国立","King":"康熙"}, {"name":"陈道明","King":"康熙"}])
myset.insert({
"name":"唐国强","King":"雍正"}) myset.insert([{"name":"陈建斌","King":"雍正"}, {"_id":1, "name":"吴奇隆","King":"四爷"}])
myset.save({
"_id":1,"name":"聂远","King":"乾隆"})

查找文档

find        查找所有
find_one    查找首个

find

find(query,field)

参数形式  同 mongoshell 中的 find

返回值   游标对象

对比 mongoDB 的语句

  所有的操作符加上引号,作为字符串形式

  true/false/null 改成 True/False/None

实例

cursor = myset.find({"name":{"$exists":True}},{"_id":0})

for i in cursor:
    # print(i)
    print(i["name"],"--",i["King"])

cursor 对象属性函数

cursor 本质为返回的文档集合的序列, 同 mongoDB 一样可以继续调用其他的精确筛选方法

next()      获取下一个文档
limit()     获取前几条文档
skip()      跳过几条
count()     计数
sort()      排序
* sort 的参数发生了变化 sort([(域名,1/-1),(),()...]) * limit,sort,skip 使用时, 必须保证游标在最开始的位置

 实例

# for i in cursor.limit(3):
 # for i in cursor.skip(3):
 # for i in cursor.sort([("name",1),("age",-1)]):
 for i in cursor.sort([("name",1)]):
     print(i)

find_one

find_one(query,field)

功能  查找首个符合条件的文档

参数  同 find

返回值  返回字典(只查到首条, 因此返回数据也是单数据, 即 字典)

实例

dic = {"$or":[{"King":"乾隆"},{"name":"陈道明"}]}
d = myset.find_one(dic,{"_id":0})
print(d)

修改操作

update_one      修改一个
update_many     修改多个
update          修改一个或多个

实例

myset.update_many({"King":"康熙"},{"$set":{"king_name":"玄烨"}})
myset.update_one({"King":"雍正"},{"$set":{"king_name":"忘了名字"}})
myset.update_one({"name":"郑少秋"},{"$set":{"King":"乾隆"}},upsert=True)
myset.update({"King":"乾隆"},{"$set":{"king_name":"弘历"}})
myset.update({"King":"乾隆"},{"$set":{"king_name":"弘历"}},multi=True)

删除操作

delete_one      删除一个
delete_many     删除多个
remove          删除一个或多个

实例

myset.delete_one({"King":"康熙"})
myset.delete_many({"King":"雍正"})
myset.remove({"king_name":{"$exists":False}})
myset.remove({"king_name":None},multi=True)

复合操作

find_one_and_update
find_one_and_delete

实例

data = myset.find_one_and_delete({"name":"张铁林"})
print(data)

文档操作整体实例

from pymongo import MongoClient

# 创建数据库链接
conn = MongoClient("localhost",27017)

# 创建数据库对象
db = conn.stu
# db = conn["stu"]

# 生成集合对象
myset = db.class0
# myset = db["class0"]

# 创建集合对象
myset = db.class4

# 数据操作


# -----------------------insert----------------------
# myset.insert_one({"name":"张铁林","King":"乾隆"})

# myset.insert_many([{"name":"张国立","King":"康熙"},\
    #  {"name":"陈道明","King":"康熙"}])

# myset.insert({"name":"唐国强","King":"雍正"})
# myset.insert([{"name":"陈建斌","King":"雍正"},\
    # {"_id":1, "name":"吴奇隆","King":"四爷"}])

# myset.save({"_id":1,"name":"聂远","King":"乾隆"})


#  ----------------------find-----------------------
# cursor = myset.find({"name":{"$exists":True}},{"_id":0})
# print(cursor.next()) # 打印下一个文档
# for i in cursor:
    # print(i)
    # print(i["name"],"--",i["King"])
# 所有的操作符加上引号,作为字符串形式
# true/false/null 改成 True/False/None


# for i in cursor.limit(3):
# for i in cursor.skip(3):
# for i in cursor.sort([("name",1),("age",-1)]):
# for i in cursor.sort([("name",1)]):
    # print(i)
# limit,sort,skip 使用时, 必须保证游标在最开始的位置

# dic = {"$or":[{"King":"乾隆"},{"name":"陈道明"}]}
# d = myset.find_one(dic,{"_id":0})
# print(d)


#  ----------------------update-----------------------
# myset.update_many({"King":"康熙"},{"$set":{"king_name":"玄烨"}})
# myset.update_one({"King":"雍正"},{"$set":{"king_name":"忘了名字"}})
# myset.update_one({"name":"郑少秋"},{"$set":{"King":"乾隆"}},upsert=True)
# myset.update({"King":"乾隆"},{"$set":{"king_name":"弘历"}})
# myset.update({"King":"乾隆"},{"$set":{"king_name":"弘历"}},multi=True)


# ------------------------delete----------------------
# myset.delete_one({"King":"康熙"})
# myset.delete_many({"King":"雍正"})
# myset.remove({"king_name":{"$exists":False}})
# myset.remove({"king_name":None},multi=True)


# ------------------------复合操作----------------------
# data = myset.find_one_and_delete({"name":"张铁林"})
# print(data)


# 关闭链接
conn.close()

索引操作

create_index    创建索引
    参数: 二元元组构成列表
        create_index([("age",1)])
        create_index([("age",1),("name":-1)])
        也可以直接写 域名 ("age") 表示对该域创建正向索引
    返回值: 索引名称
list_indexes    查看索引
drop_index      删除索引
drop_indexes    删除所有索引

聚合操作

aggregate()

功能  完成聚合操作

参数  聚合管道, 同mongoshell 中的聚合

返回值  数据操作结果游标对象

实例

lis = [
    {"$group": {"_id": "$sex", "num": {"$sum": 1}}},
]
cursor = myset.aggregate(lis)

索引聚合实例

from pymongo import MongoClient

conn = MongoClient("localhost", 27017)
db = conn.stu
myset = db.class0

# -------------------------------索引--------------------------------
# 创建
# index_name = myset.create_index("name")
# index_age = myset.create_index("age",name="Age",sparse=True)
# index_age = myset.create_index("age",name="Age",sparse=True,unique=True)


#  删除索引
# myset.drop_index("Age")
# myset.drop_indexes()


# 查看
# for i in myset.list_indexes():
# print(i)

# ------------------------------聚合----------------------------------
lis = [
    {"$group": {"_id": "$sex", "num": {"$sum": 1}}},
]

cursor = myset.aggregate(lis)
for i in cursor:
    print(i)

conn.close()

文件操作

1. 导入bson 二进制模块,连接数据库

import bson.binary

2. 选择要存储的文件, 使用 rb 方式读取内容

3. 将读取的内容转换为 bson 格式

content = bson.binary.Binary(data)

  功能  将 bytes 字串 转换为 bson 格式

  参数  bytes 字串

  返回值  转换后的数据

4. 将内容插入到数据库

实例

from pymongo import MongoClient
import bson.binary

conn = MongoClient("localhost",27017)
db = conn.image
myset = db.mm

# --------------------存储----------------------------------
# 读取图片内容
# with open("123.PNG","rb") as f:
    # data = f.read()

# 格式转化
# conntent = bson.binary.Binary(data)

# 插入数据库
# myset.insert_one({"filename":"123.jpg","data":conntent})


#--------------------取出文件-------------------------------
# img = myset.find_one({"filename":"123.jpg"})

# 写入本地
# with open("123.jpg","wb") as f:  # find_one 会自动转换不需要自己再转换了
    # f.write(img["data"])


conn.close()

 

展开阅读全文
加载中

作者的其它热门文章

打赏
0
0 收藏
分享
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部
返回顶部
顶部