大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版。
在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com
从进阶篇开始,每一篇文章都是干货满满。这一节,我们来继续说,在Django中,如何花式玩转pymongo。pymongo如何模糊查询,排序
皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_03”。
在上一节《用Django全栈开发(进阶篇)——02. 在Django中花样玩转PyMongo(上)》,我们主要讲了PyMongo的插入,搜索。分别是:
今天我们继续来说剩下的内容。
首先,修改,你得有修改数据库的权限!你得有修改数据库的权限!
修改这个没什么好说的,PyMongo主要有三个方法:
collection.update()
collection.update_many()
collection.update_one()
这里简单说一下。
self.collection.update({"jp_location": "千葉県東方沖"}, {"jp_location": "千葉県東方沖update"})
update()
方法,我们将jp_location
是千葉県東方沖
的数据,把他的jp_location
更新成千葉県東方沖update
,结果我们的数据成了这个样子:
我们看到,update第一个参数其实是判断条件;第二个参数是更新的内容,这里直接把数据全部修改了,而且只修改了第一条数据。
如果我们使用的是这种方法,添加一个$set
:
self.collection.update({"jp_location": "千葉県東方沖"}, {'$set':{"jp_location": "千葉県東方沖update2"}})
看到这回,虽然同样也是只修改了一条数据,但是它的修改是把对应的标签的值修改了,并不是直接替换。
这个update()方法和update_one()是一样的,我们使用
self.collection.update_one({"jp_location": "千葉県東方沖"}, {'$set':{"jp_location": "千葉県東方沖update2"}})
得到的结果也是只修改一条数据,并且以为使用了$set
,所以,修改的是局部变量。
但是如果我们使用的是:
self.collection.update_many({"jp_location": "千葉県東方沖"}, {'$set': {"jp_location": "千葉県東方沖update4"}})
结果就是把符合全部条件的数据都会更新:
首先,删除,你得有删除数据库的权限!你得有删除数据库的权限!
这里简单说一下,如果是:
collection.drop()
这个方法是直接删除数据库中的collection的。如果没有业务需求,慎用。
其他的删除方法有:
collection.remove()
collection.delete_one()
collection.delete_many()
这几个方法主要区别在于:
删除的时候,如果调用deleted_count属性可以获取删除的数据条数。
至此,增删改查就说完了,其实这些都是非常基础的内容,非常的简单,也很好理解。
正儿八经花式操作,其实是在这个修改器这里。那些所谓的增删改查,如果让查询修改一个条件可以,但是如果条件复杂,该怎么办?这个时候就得上修改器了。
这里所说的修改器,主要就是要在更新和查询中使用的,有以下这些:
$lt
是 <
;$lte
是<=
;$gt
是>
;$gte
是>=
;$ne
是!=
;$in
则是选取数据是否在指定的列表里面,公式:{ field: { $in: [,,... ]}}
$nin
则是选取数据不再给定列表里面,或者没有这个标签的数据,公式:{field:{$nin:[,...]}}
$and
,且的关系,例子:collection.find({'$and': [{'jp_location': '長野県中部'}, {'jp_id': '2020070303245039503122131'}]})
,最终找到一条数据;
$or
, 或的关系,例子:collection.find({'$and': [{'jp_location': '長野県中部'}, {'jp_id': {'$exists': True}}]})
,最终找到10条数据;
$not
, 非的关系,例子:collection.find({ price: { $not:{ $gt: 1.99 }}})
,简单说明一下,这里要找的东西是价格不大于1.99元的,或者是没有price这个标签的数据。
$nor
, 非或关系,选取的就是全部不满足条件的数据,公式:{ $nor:[{
;
$exists
,则是判断key是否存在,公式:
{ field: { $exists:
;
$set
是替换掉指定key值的value,公式:{ $set: {
;
$unset
是删除指定key-value,公式:{ $unset: {
;
$inc
是增加键值对,公式:{ $inc: {
;
$pull
是从已知的数组中,删除所给出的值,公式:{ $pull: {
,这里的意思是原有的数列的key是field1,然后删除field1数列里面的value值;
$push
是直接在原有数列里面新加字段,公式:{ $push:{
;
$pop
则是删除数列第一个或者最后一个元素,公式:{ $pop:{
,-1 是第一个元素,1 是最后一个元素;
好了,差不多这些如果掌握了的话,你在搜索个更新时候使用就够了,最后说一点小技巧。
其实每一次调用find()
方法,PyMongo返回的其实都是一个Cursor类,当你拿到Cursor的时候,比如说,如果调用for循环,循环了一遍之后,在这个时候,当你第二次调用for循环准备遍历的时候,这个时候你得到的数据是空。
为什么会这样?是因为在第一次调用循环的时候,你的指针已经从头走到了尾;当第二次再循环时,指针还在列表的尾部,所以返回数据为空。
解决办法也很简单,直接重置游标就可以:
cursor.rewind()
这样,指针就会被重置了,又可以愉快的遍历了。
最后总结一下,
如何玩转PyMongo:
update()
,update_one()
和update_many()
,分别对应的是单个修改,单个修改和群体修改;collection.drop()
,删除数据的方法则是remove()
,delete_one()
和delete_many()
,对应的是删除所有满足条件的数据,但是一条数据和删除多条数据,查看返回结果的deleted_count
属性,可以查看删除数据的条数;;整套教程源码获取,可以关注『皮爷撸码』,回复『peekpa.com』