美文网首页
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的使用

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