用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)

大家好,这是皮爷给大家带来的最新的学习Python能干啥?之Django教程的进阶版

在之前《用Django全栈开发》系列专辑里面,皮爷详细的阐述了如何编写一个完整的网站,具体效果可以浏览线上网站:Peekpa.com

从进阶篇开始,每一篇文章都是干货满满。这一节,我们来继续说,在Django中,如何花式玩转pymongo。pymongo如何模糊查询,排序

皮爷的每一篇文章,都配置相对应的代码。这篇文章的代码对应的Tag是“Advanced_03”。

用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第1张图片

前瞻回顾

在上一节《用Django全栈开发(进阶篇)——02. 在Django中花样玩转PyMongo(上)》,我们主要讲了PyMongo的插入,搜索。分别是:

  • collection.insert();
  • collection.insert_many();
  • collection.find_one();
  • collection.find();
  • 当然还有精确条件查找,模糊条件查找,组合条件查找。

今天我们继续来说剩下的内容。

修改

首先,修改,你得有修改数据库的权限!你得有修改数据库的权限!

修改这个没什么好说的,PyMongo主要有三个方法:

collection.update()
collection.update_many()
collection.update_one()

这里简单说一下。

self.collection.update({"jp_location": "千葉県東方沖"}, {"jp_location": "千葉県東方沖update"})

update()方法,我们将jp_location千葉県東方沖的数据,把他的jp_location更新成千葉県東方沖update,结果我们的数据成了这个样子:

用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第2张图片

我们看到,update第一个参数其实是判断条件;第二个参数是更新的内容,这里直接把数据全部修改了,而且只修改了第一条数据。

如果我们使用的是这种方法,添加一个$set

self.collection.update({"jp_location": "千葉県東方沖"}, {'$set':{"jp_location": "千葉県東方沖update2"}})

用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第3张图片

看到这回,虽然同样也是只修改了一条数据,但是它的修改是把对应的标签的值修改了,并不是直接替换。

这个update()方法和update_one()是一样的,我们使用

self.collection.update_one({"jp_location": "千葉県東方沖"}, {'$set':{"jp_location": "千葉県東方沖update2"}})

用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第4张图片

得到的结果也是只修改一条数据,并且以为使用了$set,所以,修改的是局部变量。

但是如果我们使用的是:

self.collection.update_many({"jp_location": "千葉県東方沖"}, {'$set': {"jp_location": "千葉県東方沖update4"}})

结果就是把符合全部条件的数据都会更新:

用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第5张图片

删除

首先,删除,你得有删除数据库的权限!你得有删除数据库的权限!

这里简单说一下,如果是:

collection.drop()

这个方法是直接删除数据库中的collection的。如果没有业务需求,慎用。

其他的删除方法有:

collection.remove()

collection.delete_one()

collection.delete_many()

这几个方法主要区别在于:

  • 直接调用remove()方法指定删除的条件即可,符合条件的所有数据均会被删除;
  • delete_one()即删除第一条符合条件的数据,返回结果是DeleteResult类型;
  • delete_many()即删除所有符合条件的数据,返回结果是DeleteResult类型;

删除的时候,如果调用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>,...}},-1 是第一个元素,1 是最后一个元素;

好了,差不多这些如果掌握了的话,你在搜索个更新时候使用就够了,最后说一点小技巧。

游标重置

其实每一次调用find()方法,PyMongo返回的其实都是一个Cursor类,当你拿到Cursor的时候,比如说,如果调用for循环,循环了一遍之后,在这个时候,当你第二次调用for循环准备遍历的时候,这个时候你得到的数据是空。

为什么会这样?是因为在第一次调用循环的时候,你的指针已经从头走到了尾;当第二次再循环时,指针还在列表的尾部,所以返回数据为空。

解决办法也很简单,直接重置游标就可以:

cursor.rewind()

这样,指针就会被重置了,又可以愉快的遍历了。

技术总结

最后总结一下,

如何玩转PyMongo:

  1. 修改和删除,首先得有修改和删除数据库的权限,才能修改和删除;
  2. PyMongo的修改有三个方法:update()update_one()update_many(),分别对应的是单个修改,单个修改和群体修改;
  3. PyMongo的删除,Collection直接删除调用方法是collection.drop(),删除数据的方法则是remove(),delete_one()delete_many(),对应的是删除所有满足条件的数据,但是一条数据和删除多条数据,查看返回结果的deleted_count属性,可以查看删除数据的条数;;
  4. 修改器,老多了,老有意思了,可以参考MongoDB的官方文档里面的修改器文档,90%基本都能用:https://docs.mongodb.com/manual/reference/operator/query/;
  5. 进阶篇的**玩转PyMongo(下)**总结完毕。

整套教程源码获取,可以关注『皮爷撸码』,回复『peekpa.com』

长按下图二维码关注,如文章对你有启发或者能够帮助到你,欢迎点赞在看转发三连走一发,这是对我原创内容输出的最大肯定。
用Django全栈开发(进阶篇)——03. 在Django中花样玩转PyMongo(下)_第6张图片

你可能感兴趣的:(Django,Peekpa.com,Python)