美文网首页
2020-07-21--爬虫项目 -02--mongodb的使用

2020-07-21--爬虫项目 -02--mongodb的使用

作者: program_white | 来源:发表于2020-07-21 21:55 被阅读0次

索引和排序

为文档中的一些key加上索引(index)可以加快搜索速度。这一点不难理解,假如没有没有索引,我们要查找名字为Seven的电影,就必须在所有文档里逐个搜索。而如果对名字这个key加上索引值,则电影名这个字符串和数字建立了映射,这样在搜索的时候就会快很多。排序的时候也是如此,不赘述。MongoDB里面为某个key加上索引的方式很简单,比如我们要对导演这个key加索引,则可以:

db.movie.ensureIndex({doc:1})

这里的1是升序索引,如果要降序索引,用-1。

MongoDB支持对输出进行排序,比如按喜欢数排序:

db.movie.find({}).sort({likes:1})

同样地,1是升序,-1是降序。默认是1。

db.movie.getIndexes()

将返回所有索引,包括其名字。

删除对应的索引。

db.movie.dropIndex('index_name')

聚合

MongoDB支持类似于SQL里面的GROUP BY操作。比如当有一张学生成绩的明细表时,我们可以找出每个分数段的学生各有多少。
那么就要分组操作了。
举例:
查看导演分组:

db.movie.aggregate([{$group:{_id:'$doc'}}])

结果:

再查询每个导演拍的电影数量:

db.movie.aggregate([{$group:{_id:'$doc',nums:{$sum:1}}}])

注意$sum后面的1表示一部电影对应1,如果设为2,那么一部电影nums加2.
结果:

我们也可以统计别的数据,比如两位导演谁的赞比较多:

 db.movie.aggregate([{$group:{_id:'$doc',num_likes:{$sum:'$likes'}}}])

输出:

除了$sum,还有其它一些操作。比如:
统计平均的赞:

db.movie.aggregate([{$group:{_id:'$doc',nums:{$avg:'$likes'}}}])

返回每个导演的电影中的第一部的赞数:

db.movie.aggregate([{$group:{_id:'$directed_by',num_movie:{$first:'$likes'}}}])

All or Nothing?

MongoDB支持单个文档内的原子化操作(atomic operation),这是说,可以将多条关于同一个文档的指令放到一起,他们要么一起执行,要么都不执行。而不会执行到一半。有些场合需要确保多条执行一起顺次执行。比如一个场景:一个电商网站,用户查询某种商品的剩余数量,以及用户购买该种商品,这两个操作,必须放在一起执行。不然的话,假定我们先执行剩余数量的查询,这是假定为1,用户接着购买,但假如这两个操作之间还加入了其它操作,比如另一个用户抢先购买了,那么原先购买用户的购买的行为就会造成数据库的错误,因为实际上这种商品以及没有存货了。但因为查询剩余数量和购买不是在一个“原子化操作”之内,因此会发生这样的错误[2]
MongoDB提供了findAndModify的方法来确保atomic operation。比如这样的:

#返回修改之前的记录
db.movie.findAndModify(
    {
        query:{'xanme':'灰猎犬号'},
        update:{$inc:{'likes':98}}
    }
    );
db.movie.find();

query是查找出匹配的文档,和find是一样的,而update则是更新likes这个项目。注意由于MongoDB只支持单个文档的atomic operation,因此如果query出多于一个文档,则只会对第一个文档进行操作。
findAndModify还支持更多的操作,具体见:http://docs.mongodb.org/manual/reference/command/findAndModify/。

文本搜索

MongoDB还支持文本搜索。对文本搜索之前,我们需要先对要搜索的key建立一个text索引。假定我们要对标题进行文本搜索,我们可以这样:
查询灰猎犬号:

//创建文本索引
db.movie.ensureIndex({xanme:'text'});
//文本索引查询
db.movie.find({$text:{$search:'灰猎犬号'}});

注意text和search前面的$符号。

这个例子里,文本搜索作用不是非常明显。但假设我们要搜索的key是一个长长的文档,这种text search的方便性就显现出来了。MongoDB目前支持15种语言的文本搜索。

正则表达式

MongoDB还支持基于正则表达式的查询。如果不知道正则表达式是什么,可以参考Wikipedia。这里简单举几个例子。比如,查找标题以b结尾的电影信息:

db.movie.find({title:{$regex:'.*b$'}}).pretty()

也可以写成:

db.movie.find({title:/.*b$/}).pretty()

查找含有'Fight'标题的电影:

db.movie.find({title:/Fight/}).pretty()

注意以上匹配都是区分大小写的,如果你要让其不区分大小写,则可以:

db.movie.find({title:{$regex:'fight.*b',$options:'$i'}}).pretty()

$i是insensitive的意思。这样的话,即使是小写的fight,也能搜到了。

相关文章

  • 2020-07-21--爬虫项目 -02--mongodb的使用

    索引和排序 为文档中的一些key加上索引(index)可以加快搜索速度。这一点不难理解,假如没有没有索引,我们要查...

  • 2020-07-20--爬虫项目 -02--mongodb的使用

    为什么用MongoDB? 传统的计算机应用大多使用关系型数据库来存储数据,比如大家可能熟悉的MySql, Sqli...

  • 爬虫就业冲刺20180818

    一、教学内容 1、使用scrapy实现之前的音乐爬虫 教学内容: 复习之前的音乐爬虫项目 scrapy使用进阶 使...

  • windows环境下安装Python Scrapy

    学习背景 由于最近项目需要爬虫获取数据,现学习python语言,可使用pthon原生爬虫和scrapy框架两种爬虫...

  • Scrapy的用法

    1.第一步:创建爬虫项目 2.使用pycharm打开爬虫项目 打开结果如下(目录结构): 3.第三步:创建爬虫说明...

  • Scrapy爬虫项目创建

    1.新建一个爬虫项目 可以使用 scrapy startproject 项目名称 2.创建一个自己的爬虫文件 sc...

  • mm131爬虫(scrapy)

    Scrapy 基本使用 1. Install 2. 新建爬虫项目 3. 新建爬虫,在 spiders 目录下创建(...

  • scrapy输出到文件字符编码设置

    使用scrapy命令行工具建立了爬虫项目(startproject),并使用scrapy genspider建立了...

  • 认识Scrapy框架

    开发python,从程序的复杂程度可分为:爬虫项目和爬虫文件。 使用Scrapy可以提高开发效率。 Scrapy安...

  • scrapy入门使用及pycharm远程调试

    一·scrapy的入门使用 scrapy的安装 创建scrapy项目 创建scrapy爬虫:在项目目录下执行 运行...

网友评论

      本文标题:2020-07-21--爬虫项目 -02--mongodb的使用

      本文链接:https://www.haomeiwen.com/subject/ckdwkktx.html