第一步,连接 MongoDB:
# 方式一: 使用默认的配置
client = MongoClient()
# 方式二: 指定主机地址和端口号
client = MongoClient('localhost', 27017)
# 方式三: 使用URL连接参数
client = MongoClient('mongodb://localhost:27017/')
☑️
第二步,管理数据库:
#通过MongoClient对象来管理多个数据库获取数据库(逻辑库)对象
db = client.DATABASE_NAME
☑️
db = client["DATABASE_NAME"]
查看当前数据库下的集合列表
db.list_collection_names()
pymongo 在插入数据时可以将 python 的对象转换成 BSON
distinct方法 :获取集合中指定指定的不重复值,数组形式返回
添加
insert_one():
插入一个文档,该方法的第一参数是字典键值对
insert_one() 方法返回 InsertOneResult 对象,该对象包含 inserted_id 属性,它是插入文档的 id 值。
如果在插入文档时没有指定 _id,MongoDB 会为每个文档添加一个唯一的 id。
insert_many():
批量新增文档,该方法的第一参数是字典列表
insert_many() 方法返回 InsertManyResult 对象,该对象包含 inserted_ids 属性,该属性保存着所有插入文档的 id 值
查找
find使用正则表达式$regex查找
正则表达式修饰符只用于搜索字符串的字段。
query = {'name': {'$regex': '3$'}}
datas = my_col.find(query)
result = db.cars.find({"name":{"$regex":"裤"}})
for i in result:
print(i)
find高级查询($gt、$gte等)
可以使用修饰符。$gt、$gte等
query = {'name': {'$gte': 'dgw3'}}
datas = my_col.find(query)
排序sort()
sort() 方法可以指定升序或降序排序。
sort() 方法第一个参数为要排序的字段,第二个字段指定排序规则,1 为升序,-1 为降序,默认为升序。
document = my_col.find().sort('age', -1)
☑️
cars = db.cars.find().sort("price", DESCENDING)
修改
使用update_one()修改一条数据
使用 update_one() 方法修改文档中的记录。该方法第一个参数为查询的条件,第二个参数为要修改的字段。
如果查找到的匹配数据多于一条,则只会修改第一条。
update_one()是局部更新替换,只需要替换更新需要修改的字段即可。
使用update_one()时,对于不存在的字段是直接添加,存在的字段是更新
query = {'_id': '1', 'name': 'dgw1'}
new_value = {'$set': {'age': 21}}
my_col.update_one(query, new_value)
使用update_many()修改多条数据
update_many()是局部更新替换,只需要替换更新需要修改的字段即可。
query = {'name': 'dgw1'}
new_value = {'$set': {'age': 23}}
num = my_col.update_many(query, new_value)
修改文档
$set 设置文档中的某个字段的值
$unset 从文档中将某个字段移除
$currentDate 设置值为当前的日期
$inc 将某个字段的值增加1
$min 只更新如果指定的值小于现在有字段的值
$max 只更新如果指定的值大于现在有字段的值
$mul 增加指定数量的值
$rename 将字段重命名
聚合计算集合中数据的聚合值aggregate()
$sum
运算符计算并返回数值的总和。 $group
运算符通过指定的标识符表达式对输入文档进行分组,并将累加器表达式(如果指定)应用于每个组。
$match
里的条件其实就和使用find
函数里是一样的
注意: {"$group":{"_id":"$user_id"}} 分组的名称必须是_id 才行换成其他key或者自己重新命名key报错:pymongo.errors.OperationFailure: The field 'user_id' must be an accumulator object
聚合查询使用的是aggregate
函数,它的参数是 pipeline
管道,管道的概念是用于将当前命令的输出结果作为下一个命令的参数,管道是有顺序的,比如通过第一个管道操作以后没有符合的数据那么之后的管道操作也就不会有输入,所以一定得要注意管道操作的顺序
pipeline = [
{'$match':{'price':{'$gte':50}}},
{'$group': {'_id': "$fName", 'count': {'$sum': 1}}},
]
$match
里的条件其实就和使用find
函数里是一样的。
$group
操作,group意为分组,指数据根据哪个字段进行分组
上面使用的{'$group': {'_id': "$fName", 'count': {'$sum': 1}
,
_id
为所要分的组,这里是以fName
字段分的,
后面的'count': {'$sum': 1}
,这里的$sum
就是求和的意思,后面的值是1,也就是说每出现一次就加1,这样就能达到计数的目的
如果要计算价格 price
的和,那么这里就应该写成这样
注意这里的price字段要有$
的
pipeline = [
{'$match':{'price':{'$gte':50}}},
{'$group': {'_id': "$fName", 'avg': {'$avg': '$price'}}},
]
for i in db.cars.aggregate(pipeline):
print i
val = list(db.cars.aggregate(pipeline))
print('The sum of prices is {}'.format(val[0]['all']))
$min
(求最小值),$max
(求最大值),$avg(求平均值)
在使用$match
時也常搭配上逻辑符号,如$or
、$gt
、$lt
,能够更精准的描述想要的资料
agr = [{'$match': {'$or': [{'name': "Audi"}, {'name': "Volvo"}]}},
{'$group': {'_id': 1, 'sum2cars': {'$sum': "$price"}}}]
删除文档
删除单个文档
使用 delete_one() 方法来删除一个文档,该方法第一个参数为查询对象,指定要删除哪些数据。如果查询到多条数据,只会删除查询到的第一条数据。
query = {'_id': '1', 'name': 'dgw1'}
db.cars.delete_one(query)
删除多个文档数据
使用 delete_many() 方法来删除多个文档,该方法第一个参数为查询对象,指定要删除哪些数据
query = {'name': 'dgw2'}
db.cars.delete_many(query)
删除集合中的所有文档
delete_many() 方法如果传入的是一个空的查询对象,则会删除集合中的所有文档
删除集合
使用 drop() 方法来删除一个集合。
db.cars.drop()
查找
find()
和find_one()
的第一个参数是一个过滤器。
筛选器是所有文档必须匹配的条件。
find_one(): 按条件查询一个文档
find(): 按条件查询多个文档
若查找全部,参数可为空
expensive_cars = db.cars.find({'price': {'$gt': 50000}})
for ecar in expensive_cars:
print(ecar['name'])
python mongo生成ObjectId()
投影
通过投影,我们可以从返回的文档中选择特定字段。
投影在find()
方法的第二个参数中传递。
cars = db.cars.find({}, {'_id': 1, 'name':1})
for car in cars:
print(car)
-
1
或true
将该字段包括在退货单据中。 -
0
或false
排除该字段。 -
对于该
_id
字段,您不必显式指定要返回该字段。除非您指定禁止显示该字段,否则该方法始终返回_id字段。
我们可以指定包含或排除投影,但不能同时指定。
python打印find数据
find 查询出来的是一个列表集合。
myquery = { "name": { "$gt": "H" } }
mydoc = mycol.find(myquery)
for x in mydoc:
print(x)
for x in db.cars.find():
print(x)
cars = db.cars.find()
for car in cars:
print('{0} {1}'.format(car['name'],
car['price']))
使用list()
方法,我们可以将游标转换为 Python 列表。 它将所有数据加载到内存中
print(list(cars))
限制数据输出
limit()
指定要返回的文档数量,skip()
指定从哪条数据开始
cars = db.cars.find().skip(2).limit(3)
skip()
方法跳过前两个文档,limit()
方法将输出限制为三个文档。
返回指定条数记录limit()
对查询结果设置指定条数的记录可以使用 limit() 方法,该方法只接受一个数字参数。
my_col = my_db['test_col']
datas = my_col.find().limit(3)
指定从哪条数据开始skip()
对查询结果设置指定开始位置查询可以使用 skip() 方法,该方法只接受一个数字参数。
datas = my_col.find().skip(3)
部分汇总
find_one(): 按条件查询一个文档
find(): 按条件查询多个文档
count_documents(): 统计满足条件的文档总数
aggregate(): 聚合统计
.sort(): 排序
.skip().limit(): 分页
计数文件
统计满足条件的文档总数count_documents() 必须有过滤条件!
在count_documents()
方法中,可以传递一个查询条件,来获取符合条件的文档数量。如果传递一个空的查询条件{}
,则会获取集合中的所有文档数量。
n_cars = db.cars.count_documents({})
count()已过时
使用command()
向 MongoDB 发出命令
1、serverStatus
命令返回 MongoDB 服务器的状态
status = db.command("serverStatus")
pprint(status)
2、dbstats
命令返回反映单个数据库使用状态的统计信息
status = db.command("dbstats")
pprint(status)
PyMongo 游标
find 方法返回一个 PyMongo 游标,该游标是对查询结果集的引用。
cars = db.cars.find()
print(cars.next())
print(cars.next())
print(cars.next())
cars.rewind()
print(cars.next())
print(cars.next())
print(cars.next())
rewind()
方法将游标倒回其未评估状态。
时间范围查询
在MongoDB中,可以使用$gte和$lte运算符来进行时间范围查询。