pymongo的简单使用
MongoDB是典型的非关系型数据库,它的存储形式是BSON(Binary JSON),是类似于JSON格式的二进制存储。这里旨在介绍一些python3下pymongo库的一些简单用法。
1.连接MongoDB
python下连接MongoDB需要用到pymongo库里面的MongoClient。这里有两种形式,一种是传递IP地址和端口即可:
import pymongo
MONGO_CONFIG = {
'host': '127.0.0.1',
'port': 27017,
}
if __name__ == '__main__':
# python的解包
client = pymongo.MongoClient(**MONGO_CONFIG)
# 输出所有的数据库的名称
name_list = client.list_database_names()
print(name_list)
比如在我所连的数据库上,输出如下:
另一种则是传入MongoDB的连接字符串
client = pymongo.MongoClient("mongodb://127.0.0.1:27017/")
能达到和上面同样的效果。
注:localhost为本地回环地址,等同于127.0.0.1,主要用作测试使用。
如果出现:
表示mongodb需要认证,此时可以键入:
# 假定mongodb存在名称为tutorial的数据库
db = client.tutorial
# 同db = client['db']
# 账号为123,密码为123
db.authenticate(name='123', password='123')
在指定了数据库后,就可以对数据库中的集合进行操作了。
首先需要指定集合:
collection = db.QuoteItem;
# collection = db['QuoteItem']
这样就得到了一个Collection对象。(在mongodb中,数据库中保存的是很多集合,也可以理解为关系型数据库中的表。)
2.查询
查询主要有两个函数 find和find_one(),前者返回的是python中的迭代器类型,可以获得多个值,后者则会返回一个值,为字典类型。
2.1 查询单条记录
首先是find_one函数:
condition = {}
collection.find_one(condition)
我们根据condition所给的条件进行查询,目前并未指定条件,而又使用了find_one()函数,此时获取的是第一条数据,这里输出如下:
{
'_id': ObjectId('5cef8ccfee198f0282e95ae8'),
'text': '“The world as we have created it is a process of o...',
'author': 'Albert Einstein',
'tags': ['change', 'deep-thoughts', 'thinking', 'world']
}
_id是mongo在插入时自动添加的,我们也可以根据_id的值进行操作:
from bson.objectid import ObjectId
result = collection.find_one({'_id': ObjectId('5cef8ccfee198f0282e95ae8')})
print(result)
返回结果如上相同。
2.2 查询多条记录
对于多条数据的查询,则可以使用find()函数,比如这里要查询tags中存在'books'的数据:
results = collection.find({'tags': 'books'})
print(results)
for result in results:
print(result)
运行结果如下:
<pymongo.cursor.Cursor object at 0x000001E241791518>
{'_id': ObjectId('5cef8ccfee198f0282e95aeb'), 'text': '“The person, be it gentleman or lady, who has not...', 'author': 'Jane Austen', 'tags': ['aliteracy', 'books', 'classic', 'humor']}
{'_id': ObjectId('5cef8cd0ee198f0282e95afa'), 'text': '“Good friends, good books, and a sleepy conscience...', 'author': 'Mark Twain', 'tags': ['books', 'contentment', 'friends', 'friendship', 'life']}
{'_id': ObjectId('5cef8cd1ee198f0282e95b0e'), 'text': '“I have always imagined that Paradise will be a ki...', 'author': 'Jorge Luis Borges', 'tags': ['books', 'library']}
{'_id': ObjectId('5cef8cd1ee198f0282e95b11'), 'text': '“You can never get a cup of tea large enough or a...', 'author': 'C.S. Lewis', 'tags': ['books', 'inspirational', 'reading', 'tea']}
{'_id': ObjectId('5cef8cd2ee198f0282e95b1e'), 'text': '“If you only read the books that everyone else is...', 'author': 'Haruki Murakami', 'tags': ['books', 'thought']}
从上面可知,find()方法返回的是一个Cursor对象,可以通过list(results)转成列表。
2.3 限定返回的键值对
另外,也可以通过限定返回的键值对,比如这里我不需要_id,只需要author和tags,那么我可以改为:
results = collection.find({'tags': 'books'}, {'_id': 0, 'author': 1, 'tags': 1})
3.插入数据
数据的插入主要有两种方法,insert_one()和insert_many(),另外还有一个insert()方法,不过官方并不建议使用。
3.1 插入单条记录
item = {
'text': 'I exist because you need me.',
'author': 'sky',
'tags': ['love', 'future']
}
result = collection.insert_one(item)
print(result)
print(result.inserted_id)
运行结果如下:
<pymongo.results.InsertOneResult object at 0x000001E9D6F19D88>
5d2d11b7468fd60fa9cf2a30
返回结果为InsertOneResult对象,通过它的inserted_id属性可以获取_id。
3.2 插入多条记录
item1 = {
'text': 'I exist because you need me.',
'author': 'sky',
'tags': ['love', 'future']
}
item2 = {
'text': 'We will be together forever',
'author': 'sky',
'tags': ['love', 'future']
}
result = collection.insert_many([item1, item2])
print(result)
print(result.inserted_ids)
运行结果如下:
<pymongo.results.InsertManyResult object at 0x0000019CFFF39B88>
[ObjectId('5d2d128d42638b31f4694743'), ObjectId('5d2d128d42638b31f4694744')]
返回的是InsertManyResult对象,通过它的inserted_ids可以获取数据的_id。