PyMongo教程展示了如何在Python中对MongoDB进行编程。代码示例可在作者的Github存储库中找到。
MongoDB是一个NoSQL跨平台的面向文档的数据库。它是可用的最受欢迎的数据库之一。MongoDB由MongoDBInc.开发,并作为免费开源软件发布。
record在MongoDB中就是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可能包括其他文档、数组、文档的数组。MongoDB将文档存储在集合中。集合类似于关系数据库中的表,文档类似于行
游标是对查询结果集的引用。客户端可以遍历游标来检索结果。默认情况下,游标会在十分钟不活动后超时。
PyMongo
PyMongo是一个与MongoDB一起工作的Python模块
安装PyMongo
以下命令用于安装PyMongo。
$ sudo pip install pymongo
我们使用pip
安装PyMongo。
创建MongoDB数据库
mongo
工具是MongoDB的交互式JavaScriptshell接口,它为系统管理员提供了一个接口,也为开发人员提供了一种直接使用数据库测试查询和操作的方法。
$ mongo testdb MongoDB shell version: 2.6.10 connecting to: testdb > show dbs admin (empty) local 0.078GB test 0.078GB testdb 0.078GB
我们创建一个testdb
数据库。
PyMongo创建集合
在第一个示例中,我们创建了一个新集合。MongoDB将文档存储在集合中。集合类似于关系数据库中的表。
#!/usr/bin/python from pymongo import MongoClient cars = [ {'name': 'Audi', 'price': 52642}, {'name': 'Mercedes', 'price': 57127}, {'name': 'Skoda', 'price': 9000}, {'name': 'Volvo', 'price': 29000}, {'name': 'Bentley', 'price': 350000}, {'name': 'Citroen', 'price': 21000}, {'name': 'Hummer', 'price': 41400}, {'name': 'Volkswagen', 'price': 21600} ] client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb db.cars.insert_many(cars)
该示例创建了一个新的cars
集合。它包含八个文件。
cars = [ {'name': 'Audi', 'price': 52642}, {'name': 'Mercedes', 'price': 57127}, {'name': 'Skoda', 'price': 9000}, {'name': 'Volvo', 'price': 29000}, {'name': 'Bentley', 'price': 350000}, {'name': 'Citroen', 'price': 21000}, {'name': 'Hummer', 'price': 41400}, {'name': 'Volkswagen', 'price': 21600} ]
这个Python字典存储了八条要插入到MongoDB集合中的记录。
client = MongoClient('mongodb://localhost:27017/')
MongoClient
用于与MongoDB通信。我们向MongoClient
传递主机名和端口号。
db = client.testdb
我们获得了对testdb
数据库的引用。
db.cars.insert_many(cars)
使用insert_many
方法,我们将八个文档插入到cars
集合中,该集合也是自动创建的。
> db.cars.find() { "_id" : ObjectId("5b41eb21b9c5d915989d48a8"), "price" : 52642, "name" : "Audi" } { "_id" : ObjectId("5b41eb21b9c5d915989d48a9"), "price" : 57127, "name" : "Mercedes" } { "_id" : ObjectId("5b41eb21b9c5d915989d48aa"), "price" : 9000, "name" : "Skoda" } { "_id" : ObjectId("5b41eb21b9c5d915989d48ab"), "price" : 29000, "name" : "Volvo" } { "_id" : ObjectId("5b41eb21b9c5d915989d48ac"), "price" : 350000, "name" : "Bentley" } { "_id" : ObjectId("5b41eb21b9c5d915989d48ad"), "price" : 21000, "name" : "Citroen" } { "_id" : ObjectId("5b41eb21b9c5d915989d48ae"), "price" : 41400, "name" : "Hummer" } { "_id" : ObjectId("5b41eb21b9c5d915989d48af"), "price" : 21600, "name" : "Volkswagen" }
我们使用mongo
工具验证数据。
PyMongo列表集合
使用collection_names
,我们可以得到数据库中可用集合的列表。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb print(db.collection_names())
该示例打印testdb
数据库中的集合。
PyMongo掉落集合
drop
方法从数据库中删除一个集合。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb db.cars.drop()
该示例从testdb
数据库中删除cars
集合。
PyMongo运行命令
我们可以使用command
向MongoDB发出命令。serverStatus
命令返回MongoDB服务器的状态。
#!/usr/bin/python from pymongo import MongoClient from pprint import pprint client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb status = db.command("serverStatus") pprint(status)
该示例打印冗长的服务器状态。
dbstats
命令返回反映单个数据库使用状态的统计信息。
#!/usr/bin/python from pymongo import MongoClient from pprint import pprint client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb print(db.collection_names()) status = db.command("dbstats") pprint(status)
该示例打印testdb
的数据库统计信息。
PyMongo游标
查找方法返回一个PyMongo游标,它是对查询结果集的引用。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb cars = db.cars.find() print(cars.next()) print(cars.next()) print(cars.next()) cars.rewind() print(cars.next()) print(cars.next()) print(cars.next()) print(list(cars))
在示例中,我们使用游标。
cars = db.cars.find()
find
方法返回一个PyMongo游标。
print(cars.next())
使用next
方法,我们从结果集中获取下一个文档。
cars.rewind()
rewind
方法将游标倒回到其未评估的状态。
print(list(cars))
使用list
方法,我们可以将游标转换为Python列表。它将所有数据加载到内存中。
PyMongo读取所有数据
在下面的示例中,我们从集合中读取所有记录。我们使用Pythonfor循环遍历返回的游标。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb cars = db.cars.find() for car in cars: print('{0} {1}'.format(car['name'], car['price']))
该示例打印集合中的所有汽车名称及其价格。
cars = db.cars.find()
find
方法选择集合或视图中的文档,并将光标返回到所选文档。游标是对查询结果集的引用。
for car in cars: print('{0} {1}'.format(car['name'], car['price']))
使用Pythonfor循环,我们迭代结果集。
$ ./all_cars.py Audi 52642 Mercedes 57127 Skoda 9000 Volvo 29000 Bentley 350000 Citroen 21000 Hummer 41400 Volkswagen 21600
PyMongo统计文件
使用count
方法检索文档的数量。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb n_cars = db.cars.find().count() print("There are {} cars".format(n_cars))
该示例使用count
计算集合中汽车的数量。
$ ./count_cars.py There are 8 cars
集合中有八辆车。
PyMongo过滤器
find
和find_one
的第一个参数是过滤器。过滤器是所有文档必须匹配的条件。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb expensive_cars = db.cars.find({'price': {'$gt': 50000}}) for ecar in expensive_cars: print(ecar['name'])
该示例打印价格大于50000的汽车名称。
expensive_cars = db.cars.find({'price': {'$gt': 50000}})
find
方法的第一个参数是所有返回记录必须匹配的过滤器。该过滤器使用$gt
运算符仅返回昂贵的汽车。
$ ./filtering.py Audi Mercedes Bentley
PyMongo投影
通过投影,我们可以从返回的文档中选择特定的字段。投影在find
方法的第二个参数中传递。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb cars = db.cars.find({}, {'_id': 1, 'name':1}) for car in cars: print(car)
该示例打印文档的_id
和name
字段。
cars = db.cars.find({}, {'_id': 1, 'name':1})
我们可以指定包含或排除投影,但不能同时指定。
$ ./projection.py {'name': 'Audi', '_id': ObjectId('5b41eb21b9c5d915989d48a8')} {'name': 'Mercedes', '_id': ObjectId('5b41eb21b9c5d915989d48a9')} {'name': 'Skoda', '_id': ObjectId('5b41eb21b9c5d915989d48aa')} {'name': 'Volvo', '_id': ObjectId('5b41eb21b9c5d915989d48ab')} {'name': 'Bentley', '_id': ObjectId('5b41eb21b9c5d915989d48ac')} {'name': 'Citroen', '_id': ObjectId('5b41eb21b9c5d915989d48ad')} {'name': 'Hummer', '_id': ObjectId('5b41eb21b9c5d915989d48ae')} {'name': 'Volkswagen', '_id': ObjectId('5b41eb21b9c5d915989d48af')}
PyMongo排序文件
我们可以使用sort
对文档进行排序。
#!/usr/bin/python from pymongo import MongoClient, DESCENDING client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb cars = db.cars.find().sort("price", DESCENDING) for car in cars: print('{0} {1}'.format(car['name'], car['price']))
该示例按价格降序对记录进行排序。
$ ./sorting.py Bentley 350000 Mercedes 57127 Audi 52642 Hummer 41400 Volvo 29000 Volkswagen 21600 Citroen 21000 Skoda 9000
PyMongo聚合
聚合计算集合中数据的聚合值。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb agr = [ {'$group': {'_id': 1, 'all': { '$sum': '$price' } } } ] val = list(db.cars.aggregate(agr)) print('The sum of prices is {}'.format(val[0]['all']))
该示例计算所有汽车价格的总和。
agr = [ {'$group': {'_id': 1, 'all': { '$sum': '$price' } } } ]
$sum
运算符计算并返回数值的总和。$group
运算符按指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。
val = list(db.cars.aggregate(agr))
aggregate
方法对cars
集合应用聚合操作。
$ ./aggregate_sum.py The sum of prices is 581769
所有值的总和是581769。
我们可以使用$match
运算符来选择特定的汽车进行聚合。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb agr = [{ '$match': {'$or': [ { 'name': "Audi" }, { 'name': "Volvo" }] }}, { '$group': {'_id': 1, 'sum2cars': { '$sum': "$price" } }}] val = list(db.cars.aggregate(agr)) print('The sum of prices of two cars is {}'.format(val[0]['sum2cars']))
该示例计算奥迪和沃尔沃汽车的价格总和。
agr = [{ '$match': {'$or': [ { 'name': "Audi" }, { 'name': "Volvo" }] }}, { '$group': {'_id': 1, 'sum2cars': { '$sum': "$price" } }}]
该表达式使用$match
、$or
、$group
和$sum
运算符来执行任务。
$ ./sum_two_cars.py The sum of prices of two cars is 81642
两辆车的价格总和是81642。
PyMongo限制数据输出
limit
查询选项指定要返回的文档数,skip
选项指定一些文档。
#!/usr/bin/python from pymongo import MongoClient client = MongoClient('mongodb://localhost:27017/') with client: db = client.testdb cars = db.cars.find().skip(2).limit(3) for car in cars: print('{0}: {1}'.format(car['name'], car['price']))
该示例从cars
集合中读取,跳过前两个文档,并将输出限制为三个文档。
cars = db.cars.find().skip(2).limit(3)
skip
方法跳过前两个文档,limit
方法将输出限制为三个文档。
$ ./limit_documents.py Skoda: 9000 Volvo: 29000 Bentley: 350000
在PyMongo教程中,我们使用了MongoDB和Python。
访问Python教程或列出所有Python教程。