PyMongo 基础使用指南

pymongo是Python中用来操作MongoDB的一个库。而MongoDB是一个基于分布式文件存储的数据库,其文件存储格式类似于JSON,叫BSON.

连接数据库

使用pymongo的第一步是创建一个MongoClient来运行mongodb实例

from pymongo import MongoClient
Client = MongoClient()
复制代码

获取数据库

一个MongoDB实例可以支持多个独立的数据库。 使用PyMongo时,可以使用MongoClient实例上的属性来访问数据库,也可以使用字典的方式访问.

db = client.test_database
db = client['test-database']
复制代码

获取Collection

集合是一组存储在MongoDB中的document,可以被认为与关系数据库中的表格大致相当。 在PyMongo中获取集合与获取数据库的工作方式相同:

collection = db.test_collection
collection = db['test-collection']
复制代码

MongoDB中的Collection是惰性创建的, 上述命令并没有在MongoDB服务器上执行任何操作.Collection和数据是在第一个document被插入时创建的.

documents

MongoDB使用JSON风格的文档来表示(并存储)数据.在pymongo中,使用字典来表示文档:

post = {
    "author": "Mike",
    "text": "My first blog post!",
    "tags": ["mongodb", "python", "pymongo"],
    "date": datetime.datetime.utcnow()
}
复制代码

插入文档

使用insert_one()方法在Collection中插入一个文档

>>> db.test.count({'x': 1})
0
>>> result = db.test.insert_one({'x': 1})
>>> result.inserted_id
ObjectId('54f112defba522406c9cc208')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f112defba522406c9cc208')}
复制代码

使用insert_many()方法在Collection中插入多个文档

>>> db.test.count()
0
>>> result = db.test.insert_many([{'x': i} for i in range(2)])
>>> result.inserted_ids
[ObjectId('54f113fffba522406c9cc20e'), ObjectId('54f113fffba522406c9cc20f')]
>>> db.test.count()
2
复制代码

更新文档

使用replace_one()方法在Collection中替换一个文档

>>> for doc in db.test.find({}):
...     print(doc)
...
{u'x': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
>>> result = db.test.replace_one({'x': 1}, {'y': 1})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find({}):
...     print(doc)
...
{u'y': 1, u'_id': ObjectId('54f4c5befba5220aa4d6dee7')}
复制代码

如果匹配的文档不存在,可以使用upsert选项插入新文档:

>>> result = db.test.replace_one({'x': 1}, {'x': 1}, True)
>>> result.matched_count
0
>>> result.modified_count
0
>>> result.upserted_id
ObjectId('54f11e5c8891e756a6e1abd4')
>>> db.test.find_one({'x': 1})
{u'x': 1, u'_id': ObjectId('54f11e5c8891e756a6e1abd4')}
复制代码

使用update_one()方法在Collection中更新一个文档

>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_one({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
1
>>> result.modified_count
1
>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
复制代码

使用update_many()方法在Collection中更新多个文档

>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> result = db.test.update_many({'x': 1}, {'$inc': {'x': 3}})
>>> result.matched_count
3
>>> result.modified_count
3
>>> for doc in db.test.find():
...     print(doc)
...
{u'x': 4, u'_id': 0}
{u'x': 4, u'_id': 1}
{u'x': 4, u'_id': 2}
复制代码

删除文档

使用delete_one()方法在Collection中删除一个文档

>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_one({'x': 1})
>>> result.deleted_count
1
>>> db.test.count({'x': 1})
2
复制代码

使用delete_many()方法在Collection中删除多个文档

>>> db.test.count({'x': 1})
3
>>> result = db.test.delete_many({'x': 1})
>>> result.deleted_count
3
>>> db.test.count({'x': 1})
0
复制代码

查询文档

find()

db.test.find({"hello": "world"})
复制代码

只匹配具有值“world”的关键字“hello”的文档。如果任何参数的类型不正确,则引发TypeError。 返回与此查询相对应的Cursor实例。

find_one()

查询单个文档

find_one_and_delete() 查询单个文档并删除它,返回文档。

>>> db.test.count({'x': 1})
2
>>> db.test.find_one_and_delete({'x': 1})
{u'x': 1, u'_id': ObjectId('54f4e12bfba5220aa4d6dee8')}
>>> db.test.count({'x': 1})
1
复制代码

如果查询结果有多个,则可以使用排序, 删除排序后的第一个

>>> for doc in db.test.find({'x': 1}):
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_delete(
...     {'x': 1}, sort=[('_id', pymongo.DESCENDING)])
{u'x': 1, u'_id': 2}
复制代码

find_one_and_replace()

查询单个文档并替换. 返回原始的文档或替换的文档. find_one_and_replace()方法与find_one_and_update()方法不同,只是替换过滤器匹配的文档,而不是修改现有的文档。

>>> for doc in db.test.find({}):
...     print(doc)
...
{u'x': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
>>> db.test.find_one_and_replace({'x': 1}, {'y': 1})
{u'x': 1, u'_id': 0}
>>> for doc in db.test.find({}):
...     print(doc)
...
{u'y': 1, u'_id': 0}
{u'x': 1, u'_id': 1}
{u'x': 1, u'_id': 2}
复制代码

find_one_and_update()

查找单个文档并进行更新,返回原始文档或更新的文档。

>>> db.test.find_one_and_update(
...    {'_id': 665}, {'$inc': {'count': 1}, '$set': {'done': True}})
{u'_id': 665, u'done': False, u'count': 25}}
复制代码

默认情况下, find_one_and_update()返回更新之前的文档.要返回更新之后的文档,需设置return_docuemnt参数.

>>> from pymongo import ReturnDocument
>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     return_document=ReturnDocument.AFTER)
{u'_id': u'userid', u'seq': 1}
复制代码

可以限制返回的字段

>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     projection={'seq': True, '_id': False},
...     return_document=ReturnDocument.AFTER)
{u'seq': 2}
复制代码

如果文档不存在, 可以使用upsert参数来创建文档

>>> db.example.delete_many({}).deleted_count
1
>>> db.example.find_one_and_update(
...     {'_id': 'userid'},
...     {'$inc': {'seq': 1}},
...     projection={'seq': True, '_id': False},
...     upsert=True,
...     return_document=ReturnDocument.AFTER)
{u'seq': 1}
复制代码

如果查询结果有多个,则可以使用排序, 更新排序后的第一个

>>> for doc in db.test.find({'done': True}):
...     print(doc)
...
{u'_id': 665, u'done': True, u'result': {u'count': 26}}
{u'_id': 701, u'done': True, u'result': {u'count': 17}}
>>> db.test.find_one_and_update(
...     {'done': True},
...     {'$set': {'final': True}},
...     sort=[('_id', pymongo.DESCENDING)])
{u'_id': 701, u'done': True, u'result': {u'count': 17}}
复制代码

统计

count()

获取集合中文档的数量.

最后

更多PyMongo API请移步官方文档

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值