Python操作MongoDB

白昼怎懂夜的黑 提交于 2020-02-01 19:34:28
- 安装模块:pip install pymongo
- 创建连接对象:
    from pymongo import MongoClient
    client = MongoClient(host, port)  # 未指定参数默认连接localhost:27017
    
    可使用完整的MongoDB URI来定义连接:client = MongoClient("mongodb://host:port")
- 数据库对象:使用属性或者[]方式访问数据库
        db = client.test / db = client["test"]
- 集合对象:使用属性或者[]方式访问集合
        col = db.test1 / col = db["test1"]

pymongo文档:https://www.cnblogs.com/zhouxuchen/p/5544227.html

插入文档

pymongo提供两个方法进行文档插入:(插入的集合不存在创建该集合)
    - insert_one():接收字典对象插入,返回InsertOneResult对象,其insert_id属性表示被插入文档的_id
    - insert_many():接收文档列表(可迭代即可),返回InsertManyResult对象,其insert_ids属性表示插入多个文档的_id,可使用for循环迭代
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> col = client.test.test1  # 使用集合
>>> ret = col.insert_one({"name": "雨希", "age": 18, "language": "python"})
>>> ret
<pymongo.results.InsertOneResult object at 0x10a577be0>
>>> ret.inserted_id
ObjectId('5e352d94a1e06cb2bd1dbf37')

>>> ret = col.insert_many([{"name": "雨希", "age": 14}, {"name": "fengdi", "age": 23, "gender": "男"}])
>>> ret
<pymongo.results.InsertManyResult object at 0x10a574aa0>
>>> ret.inserted_ids
[ObjectId('5e352defa1e06cb2bd1dbf38'), ObjectId('5e352defa1e06cb2bd1dbf39')]

查询数据

pymongo使用find()方法查询数据,查询可以返回在集合中的所有数据或者只返回符合筛选条件或者标准的文档
find()方法返回一个查询结果的游标,是一个可迭代产生文档的cursor对象

1. 查询所有:col.find()
2. 比较运算符查询:(其他比较操作符操作相似)
    - 等值条件:col.find({<field1>: <value1>, <field2>: <value2>, ... })
    - 大于:col.find({"field": {"$gt": "value"}})
    - 小于:col.find({"field": {"$lt": "value"}})
3. 逻辑运算符:
    - and:字典中指明多个键值对默认就是and条件
    - or:col.find({"$or": [{条件1}, {条件2}]})
    
注意:如果是嵌入文档查询,则使用<键.字段>的形式获取嵌入文档中的数据

4. 排序:find()后追加sort(字段,排序方式)进行排序,传入排序使用的字段及排序方式
    - pymongo.ASCENDING表示升序排序
    - pymongo.DESCENDING表示降序排序
    如果按照多个字段排序则可传入(字段, 排序方式)组成的列表:
        cursor = db.restaurants.find().sort([
            ("borough", pymongo.ASCENDING),
            ("zipcode", pymongo.ASCENDING)
        ])
5. 投影:find({条件}, {field:1})内部第二个字典指定结果显示的字段(1, 0)
6. 范围查询:$in,$nin
7. 正则:$regex
8. limit与skip:追加limit()、skip()方法
9. 统计数目:count()方法 (弃用)、col.count_documents({条件})方法
10. 去重:distinct("字段", {条件})
>>> from pymongo import MongoClient
>>> client = MongoClient()
>>> col = client["test"]["test1"]
>>> cursor = col.find()  # 查询所有
>>> cursor = col.find({"hometown": "蒙古"})  # 等值查询
>>> cursor = col.find({"age": {"$gt": 18}})  # 比较运算符
>>> cursor = col.find({"hometown": "蒙古", "age": {"$gt": 18}})  # and条件
>>> cursor = col.find({"$or": [{"hometown": "蒙古"}, {"age": 18}]})  # or条件
>>> import pymongo
>>> cursor = col.find({"$or": [{"hometown": "蒙古"}, {"age": 18}]}).sort("age", pymongo.ASCENDING)  # 排序
>>> cursor = col.find({}, {"name": 1, "hometown": 1, "age": 1, "_id": 0})  # 投影
>>> cursor = col.find({"age": {"$in": [18, 20]}})  # 范围查询($in, $nin)
>>> cursor = col.find({"name": {"$regex": "^郭"}})  # 正则表达式
>>> cursor = col.find().limit(3)  # limit
>>> count = col.count_documents({})  # 统计数目
>>> cursor = col.distinct("hometown")  # 去重

更新文档

pymongo提供两个方法更新文档:
    - update_one():返回一个UpdateResult对象,包含符合条件的文档数目及被修改的文档数目(使用matched_count属性、modified_count属性访问)
    - update_many():返回一个UpdateResult对象,包含符合条件的文档数目及被修改的文档数目(使用matched_count属性、modified_count属性访问)

方法接受以下三个参数:
    - 一个筛选器,可以对符合条件的文档进行更新(结构与查询条件相同)
    - 一个指定的修改语句
    - 自定义更新时的操作参数
    
更新特定字段:$set操作符
>>> ret = col.update_one({"hometown": "蒙古"}, {"$set": {"age": 25}})
>>> ret = col.update_many({"hometown": "蒙古"}, {"$set": {"age": 25}})

替换文档

替换文档即使用一个新的文档替换符合条件的文档,替换后该文档只包含替换文档的字段数据
replace_one({条件}, {文档}):返回一个UpdateResult对象,包含符合条件的文档数目及被修改的文档数目(使用matched_count属性、modified_count属性访问)

>>> col.replace_one({"name":"fengdi"}, {"name":"yuxi", "age":18})

删除文档

pymongo提供两个方法进行文档删除:需要传入条件,进行查询删除(结构与查询条件相同)
    - delete_one({条件}):返回一个DeleteResult对象,deleted_count属性查看删除的文档数目
    - delete_many({条件}):返回一个DeleteResult对象,deleted_count属性查看删除的文档数目
    删除所有文档:delete_many({}):查询条件为空即可
    
>>> ret = col.delete_one({"name": "fengdi"})
>>> ret = col.delete_many({"name": "fengdi"})

数据聚合

聚合使用aggregate()方法,接收一个管道操作列表进行文档处理返回一个cursor对象

>>> cursor = col.aggregate(
...     [
...         {"$group": {"_id": "$hometown", "counter": {"$sum": 1}}}
...     ]
... )

>>> cursor = col.aggregate(
...     [
...         {"$match": {"gender": True}},
...         {"$group": {"_id": "$hometown", "counter": {"$sum": 1}}},
...         {"$project": {"hometown": "$_id", "counter": "$counter", "_id":0}}
...     ]
... )

索引

使用create_index()方法为集合创建索引,MongoDB在创建文档时自动为_id字段创建索引

为一个或多个字段(联合)创建索引,使用多个(字段, 索引类型)组成的列表作为参数:返回索引名字
    - 升序的索引,指定pymongo.ASCENDING
    - 降序的索引,指定pymongo.DESCENDING

>>> col.create_index([("name", pymongo.ASCENDING)])  # 单字段索引
>>> col.create_index([
        ("cuisine", pymongo.ASCENDING),
        ("address.zipcode", pymongo.DESCENDING)
])  # 复合索引

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!