菜鸟如何用python操作MongoDB?( 二 )


result = collection.find_one({'name': 'Mike'})print(type(result))print(result)这里我们查询name为Mike的数据,它的返回结果是字典类型,运行结果如下:
<class 'dict'>{'_id': ObjectId('5932a80115c2606a59e8a049'), 'id': '20170202', 'name': 'Mike', 'age': 21, 'gender': 'male'}可以发现,它多了_id属性,这就是MongoDB在插入过程中自动添加的 。
此外,我们也可以根据ObjectId来查询,此时需要使用bson库里面的objectid:
from bson.objectid import ObjectIdresult = collection.find_one({'_id': ObjectId('593278c115c2602667ec6bae')})print(result)其查询结果依然是字典类型,具体如下:
{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}当然,如果查询结果不存在,则会返回None 。
对于多条数据的查询,我们可以使用find()方法 。例如,这里查找年龄为20的数据,示例如下:
results = collection.find({'age': 20})print(results)for result in results: print(result)运行结果如下:
<pymongo.cursor.Cursor object at 0x1032d5128>{'_id': ObjectId('593278c115c2602667ec6bae'), 'id': '20170101', 'name': 'Jordan', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278c815c2602678bb2b8d'), 'id': '20170102', 'name': 'Kevin', 'age': 20, 'gender': 'male'}{'_id': ObjectId('593278d815c260269d7645a8'), 'id': '20170103', 'name': 'Harden', 'age': 20, 'gender': 'male'}返回结果是Cursor类型,它相当于一个生成器,我们需要遍历取到所有的结果,其中每个结果都是字典类型 。
如果要查询年龄大于20的数据,则写法如下:
results = collection.find({'age': {'$gt': 20}})这里查询的条件键值已经不是单纯的数字了,而是一个字典,其键名为比较符号$gt,意思是大于,键值为20 。这里将比较符号归纳为下表 。
 

菜鸟如何用python操作MongoDB?

文章插图
 
另外,还可以进行正则匹配查询 。例如,查询名字以M开头的学生数据,示例如下:
results = collection.find({'name': {'$regex': '^M.*'}})这里使用$regex来指定正则匹配,^M.*代表以M开头的正则表达式 。
这里将一些功能符号再归类为下表 。
 
菜鸟如何用python操作MongoDB?

文章插图
 
6.查询计数
要统计查询结果有多少条数据,可以调用count()方法 。比如,统计所有数据条数:
count = collection.find().count()print(count)或者统计符合某个条件的数据:
count = collection.find({'age': 20}).count()print(count)运行结果是一个数值,即符合条件的数据条数 。
7.数据排序
排序时,直接调用sort()方法,并在其中传入排序的字段及升降序标志即可 。示例如下:
results = collection.find().sort('name', pymongo.ASCENDING)print([result['name'] for result in results])运行结果如下:
['Harden', 'Jordan', 'Kevin', 'Mark', 'Mike']这里我们调用pymongo.ASCENDING指定升序 。如果要降序排列,可以传入pymongo.DESCENDING 。
8.数据的偏移
在某些情况下,我们可能想只取某几个元素,这时可以利用skip()方法偏移几个位置,比如偏移2,就忽略前两个元素,得到第三个及以后的元素:
results = collection.find().sort('name', pymongo.ASCENDING).skip(2)print([result['name'] for result in results])运行结果如下:
['Kevin', 'Mark', 'Mike']另外,还可以用limit()方法指定要取的结果个数,示例如下:
results = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2)print([result['name'] for result in results])运行结果如下:
['Kevin', 'Mark']如果不使用limit()方法,原本会返回三个结果,加了限制后,会截取两个结果返回 。
值得注意的是,在数据库数量非常庞大的时候,如千万、亿级别,最好不要使用大的偏移量来查询数据,因为这样很可能导致内存溢出 。此时可以使用类似如下操作来查询:
from bson.objectid import ObjectIdcollection.find({'_id': {'$gt': ObjectId('593278c815c2602678bb2b8d')}})


推荐阅读