MongoDB是一个基于分布式文件存储的开源数据库系统,内容储存类似于JSON对象,它的字段值可以包含其他文档、数组及文档数组。下面介绍一点基本操作。
1.安装
首先需要安装MongoDB并启动了服务,再安装PyMongo库。对此,网上有很多教程,在这里推荐一个,里面也有快速下载的地址,点击这里.
2.连接MongoDB
我们使用MongoClient连接MongoDB,常规使用传入MongoDB的IP及端口即可,其中第一个参数为地址host,第二个参数为端口port(不传递参数时默认为27017),例如:
import pymongo
client = pymongo.MongoClient(host="localhost", port=27017)
#另一种传递参数的方法,可以起到同样的连接效果
client = pymongo.MongoClient(‘mongodb://localhost:27017/‘)
3.指定数据库
MongoDB可以建立多个数据库,而我们操作时需要指定某个数据库,以test数据库为例:
db = client.test
#同样给出另一种指定方法
db = client[‘test‘]
4.指定集合
MongoDB的每个数据库下包含许多集合,下一步需要制定要操作的集合,这里指定一个集合名称为student,下面给出声明对象的方法:
collection = db.students
#同样给出另一种指定方法
collection = db[‘student‘]
5.插入数据
指定完数据库、集合后,我们就可以进行插入数据。这里指定好学生的学号,姓名,年龄后,并调用collection的insert()方法插入数据:
students = {
‘id‘: ‘20200220‘,
‘name‘: ‘Jack‘,
‘age‘: 0
}
result = collection.insert(students)
print(result)
#打印结果:5ef02e5471ebfbf623a58267
我们也可以同时插入多条数据,每条数据其实都有一个_id属性来唯一标识。如果内有显式指明该属性,MongoDB会自动产生一个ObjectId类型的_id属性,而insert()方法在执行后返回_id值,因此上面输出的是一串看似乱码的东西。而同时插入多条数据,只需要以列表的方式传递即可,如:
students1 = {
‘id‘: ‘20200220‘,
‘name‘: ‘Jack‘,
‘age‘: 0
}
students2 = {
‘id‘: ‘20200221‘,
‘name‘: ‘Mark‘,
‘age‘: 1
}
result = collection.insert([students1,students2])
print(result)
#打印结果:[ObjectId(‘5ef038b054baeccd456a6f09‘), ObjectId(‘5ef038b054baeccd456a6f0a‘)]
不过现在更推荐使用insert_one()和insert_many()方法分别插入一条或多条记录,简要示例:
students = {
‘id‘: ‘20200220‘,
‘name‘: ‘Jack‘,
‘age‘: 0
}
result = collection.insert_one(students)
print(result)
print(result.inserted_id)
#打印结果:
# <pymongo.results.InsertOneResult object at 0x000002AFE4813388>
# 5ef039f36c1a31069d663a65
这里与上面不同的地方就是这次返回的是InsertOneResult对象,我们可以调用inserted_id属性获取_id。而对于insert_many()方法依然是与上面类似的方法,返回的是InsertManyResult,调用inserted_ids属性获取_id。
6.查询
插入数据后我们需要利用find_one()或find()方法进行查询,其中find_one()查询的是单个结果,find()则是返回一个生成器对象,我们也可以根据ObjectId来查询,此时需要使用bson苦衷的objectid,如果查找结果不存在则返回None。对于查找多条数据的查找则使用find()方法。
from bson.objectid import ObjectId
result = collection.find_one({‘name‘: "Jack"})
print(type(result))
print(result)
#打印结果:
# <class ‘dict‘>
# {‘_id‘: ObjectId(‘5ef02e5471ebfbf623a58267‘), ‘id‘: ‘20200220‘, ‘name‘: ‘Jack‘, ‘age‘: 0}
result = collection.find_one({‘_id‘: ObjectId(‘5ef02e5471ebfbf623a58267‘)})
print(result)
#打印结果:
# {‘_id‘: ObjectId(‘5ef02e5471ebfbf623a58267‘), ‘id‘: ‘20200220‘, ‘name‘: ‘Jack‘, ‘age‘: 0}
results = collection.find({‘age‘: 1})
print(results)
for result in results:
print(result)
#打印结果:
# <pymongo.cursor.Cursor object at 0x0000017C433C0248>
# {‘_id‘: ObjectId(‘5ef04a3f08c5ff91cf08d6ea‘), ‘id‘: ‘20200220‘, ‘name‘: ‘Jack‘, ‘age‘: 1}
# {‘_id‘: ObjectId(‘5ef04a3f08c5ff91cf08d6eb‘), ‘id‘: ‘20200221‘, ‘name‘: ‘Mark‘, ‘age‘: 1}
7.计数
这个数据库存储也有数据条数计数的功能,使用count()方法,可以统计所有数据条数,或某一特定条件的数据:
count = collection.find().count()
print(count)
#指定某一数据计数
count = collection.find({‘age‘: 1}).count()
print(count)
8.排序
排序时调用sort()方法,并在其中传入排序的字段升降序标志即可。
results = collection.find().sort(‘name‘, pymongo.ASCENDING)
print([result[‘name‘] for result in results])
此时我们采用的是pymogo.ASCENDING指定升序。降序可以传入pymogo.DESCENDING。
9.偏移
所谓偏移就是定向取出数据的方法,使用skip()方法偏移取出位置,如偏移2,便从第三个数据开始取出,同时再加上limit()方法指定要取出的结果个数,如:
results = collection.find().sort(‘name‘, pymongo.ASCENDING).skip(2).limit(2)
print([result[‘name‘] for result in results])
此地方注意使用的limit()方法限制了输出量,因为前面实例我并没有给出许多数据量,此地方仅强调方法。
10.更新
我们使用update()方法进行数据更新,只要在使用时指定更新的条件和更新的数据即可。例如在这个地方更新name为Jack的数据的年龄,先找出,再进行修改,最后使用update()方法将修改后的数据传入数据库。
condition = {‘name‘: ‘Jack‘}
student = collection.find_one(condition)
student[‘age‘] = 20
result = collection.update(comdition,student)
print(result)
#运行结果:
# {‘n‘: 1, ‘nModified‘: 1, ‘ok‘: 1.0, ‘updatedExisting‘: True}
# result = collection.update(comdition,{‘$set‘: student})
我们由此得知返回时字典形式,OK代表执行成功,nModified代表影响的数据条数。
最后又给出一个方法,此方法使用 $ set操作符可以只更新student字典内存在的字段。如果原先还有其他字段则不会更新也不会删除,如果不用此操作符的话,则会把之前的数据全部用student字典替换:如果原本存在其他字段,也会被删除。按实战情况选择更新方法。
与上面一样,这个方法官方不推荐使用,使用update_one()方法和update_many()方法,用法更为严谨,且后面的参数均需要使用$set操作符指定所要更新的键名,两者区别仅限查找更新时匹配的数据数量。
11.删除
删除数据直接使用remove()方法,此时会把所有符合条件的数据进行删除。当然由于版本的更新,更推荐使用delete_one()和delete_many()方法,方法都入上面同理。给出实例:
result = collection.remove({‘name‘: "Jack"})