【python学习笔记】32:使用pymongo操作MongoDB进行CRUD操作

版权声明:本文为博主原创学习笔记,如需转载请注明来源。 https://blog.csdn.net/SHU15121856/article/details/81676491

环境配置

使用Anaconda安装pymongo模块:

conda install pymongo

CRUD操作

from pymongo import MongoClient
import pymongo

# 连接到MongoDB
conn = MongoClient('127.0.0.1', 27017)
# 获取某个DB对象(这里DB的名字是newlzh)
db_lzh = conn.newlzh
# 查询集合中的一个文档(这里集合的名字是lzhCllctn1)
print("第一个文档:", db_lzh.lzhCllctn1.find_one())
# 遍历查询集合中的所有文档
for doc in db_lzh.lzhCllctn1.find():
    print(doc.get("a"))  # 使用get可以从BSON文档中获取某个属性
# 添加文档(文档)
db_lzh.lzhCllctn1.insert({"sb": "lzh"})
# 修改文档(条件操作符,修改),这里指当a小于等于3时将a设置成7
# 注意!update()默认只更新一条记录,在py3中要批量更新使用update_many()
db_lzh.lzhCllctn1.update({"a": {"$lte": 3}}, {"$set": {"a": 7}})  # 注意"$保留字"在这里要打上引号
# 删除文档(条件操作符).注意!这种方式是没法删掉的
# 注意!delete()默认只删除一条记录,remove()则删除所有符合条件的
db_lzh.lzhCllctn1.remove({"_id": "5b29dee1f5b9d062d3a61e64"})
# 查询文档数目
print("文档数目:", db_lzh.lzhCllctn1.count())
# 对查询结果排序,遍历输出一下.这里是降序,升序用ASCENDING(默认)
for doc in db_lzh.lzhCllctn1.find().sort("_id", pymongo.DESCENDING):
    print(doc)

输出:

第一个文档: {'_id': ObjectId('5b29dedaf5b9d062d3a61e61'), 'a': 1.0}
1.0
3.0
4.0
3.0
2.0
None
文档数目: 7
{'_id': ObjectId('5b72f0d340417020185f0969'), 'sb': 'lzh'}
{'_id': ObjectId('5b72f09040417020bc7afffd'), 'sb': 'lzh'}
{'_id': ObjectId('5b29dee8f5b9d062d3a61e65'), 'a': 2.0}
{'_id': ObjectId('5b29dee1f5b9d062d3a61e64'), 'a': 3.0}
{'_id': ObjectId('5b29dedef5b9d062d3a61e63'), 'a': 4.0}
{'_id': ObjectId('5b29dedcf5b9d062d3a61e62'), 'a': 3.0}
{'_id': ObjectId('5b29dedaf5b9d062d3a61e61'), 'a': 7}

注意5b29dee1f5b9d062d3a61e64这一条并没有成功删除掉,因为字符串和ObjectId是不一样的,这种条件并不能定位到这个文档。见后面ObjectId的例子。

批量CUD

使用pymongo的update(),delete()insert()默认都只操作一个文档,相当于*_one()。如果要批量操作,在Python3中使用*_many()即可。另外remove()也是会删除掉所有符合条件的文档。

对于查询(Retrieve)操作来说,用find()就已经是批量的了。所以这里说批量CUD。

以批量插入为例,一批dict作为文档放在list里面,然后就能批量插入了:

from pymongo import MongoClient

conn = MongoClient("127.0.0.1", 27017)
db_lzh = conn.newlzh
print("----插入前----")
for doc in db_lzh.lzhCllctn2.find():
    print(doc)
print("----批量插入----")
# 生成一批dict存在list里面
list_insert = [{"c": i} for i in range(5)]
# 批量插入,可以返回一个操作结果
result = db_lzh.lzhCllctn2.insert_many(list_insert)
# 看下这个返回的结果
print("返回的操作结果类型是:", type(result), ",内容是:", result)
# 从这个返回的结果可以查看刚刚插入的id
print(result.inserted_ids)
print("----插入后----")
for doc in db_lzh.lzhCllctn2.find():
    print(doc)

输出:

----插入前----
{'_id': ObjectId('5b7228c13aa65dd2c182efe5'), 'b': 6.0}
----批量插入----
返回的操作结果类型是: <class 'pymongo.results.InsertManyResult'> ,内容是: <pymongo.results.InsertManyResult object at 0x000000000317C188>
[ObjectId('5b72fbbf4041701160d36d78'), ObjectId('5b72fbbf4041701160d36d79'), ObjectId('5b72fbbf4041701160d36d7a'), ObjectId('5b72fbbf4041701160d36d7b'), ObjectId('5b72fbbf4041701160d36d7c')]
----插入后----
{'_id': ObjectId('5b7228c13aa65dd2c182efe5'), 'b': 6.0}
{'_id': ObjectId('5b72fbbf4041701160d36d78'), 'c': 0}
{'_id': ObjectId('5b72fbbf4041701160d36d79'), 'c': 1}
{'_id': ObjectId('5b72fbbf4041701160d36d7a'), 'c': 2}
{'_id': ObjectId('5b72fbbf4041701160d36d7b'), 'c': 3}
{'_id': ObjectId('5b72fbbf4041701160d36d7c'), 'c': 4}

使用ObjectId

用这种方式才能正确的使用ObjectId定位到文档:

from pymongo import MongoClient
from bson.objectid import ObjectId

conn = MongoClient("127.0.0.1", 27017)
db_lzh = conn.newlzh
# 包装成ObjectId对象放进dict
db_lzh.lzhCllctn2.remove({"_id": ObjectId("5b29dee1f5b9d062d3a61e64")})
# 输出看一下
for doc in db_lzh.lzhCllctn2.find():
    print(doc)

输出:

{'_id': ObjectId('5b7228c13aa65dd2c182efe5'), 'b': 6.0}
{'_id': ObjectId('5b72fbbf4041701160d36d78'), 'c': 0}
{'_id': ObjectId('5b72fbbf4041701160d36d79'), 'c': 1}
{'_id': ObjectId('5b72fbbf4041701160d36d7a'), 'c': 2}
{'_id': ObjectId('5b72fbbf4041701160d36d7b'), 'c': 3}
{'_id': ObjectId('5b72fbbf4041701160d36d7c'), 'c': 4}

ObjectId用的场景不多,用它来做动态URL比较常见。

猜你喜欢

转载自blog.csdn.net/SHU15121856/article/details/81676491
今日推荐