python存储MongoDB数据 (2)

当然,如果查询结果不存在,则会返回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数据

关于这些操作的更详细用法,可以在MongoDB官方文档找到:https://docs.mongodb.com/manual/reference/operator/query/。
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 ObjectId collection.find({\'_id\': {\'$gt\': ObjectId(\'593278c815c2602678bb2b8d\')}})

这时需要记录好上次查询的_id。
9. 更新
对于数据更新,我们可以使用update()方法,指定更新的条件和更新后的数据即可。例如:

condition = {\'name\': \'Kevin\'} student = collection.find_one(condition) student[\'age\'] = 25 result = collection.update(condition, student) print(result)

这里我们要更新name为Kevin的数据的年龄:首先指定查询条件,然后将数据查询出来,修改年龄后调用update()方法将原条件和修改后的数据传入。
运行结果如下:

{\'ok\': 1, \'nModified\': 1, \'n\': 1, \'updatedExisting\': True}

返回结果是字典形式,ok代表执行成功,nModified代表影响的数据条数。
另外,我们也可以使用$set操作符对数据进行更新,代码如下:

result = collection.update(condition, {\'$set\': student})

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zgzypz.html