【JS逆向基础】数据库之MongoDB
前言:接下来要介绍的这个数据库MongoDB,使用的人员远没有前面两个数据库使用的频率高,所以这里就简单介绍一下他的用法,有兴趣的朋友可以在官网上面搜索其使用文档进行详细的学习。
1 MongoDB简介
一般爬虫使用的数据库,是根据项目来定的。如需求方指定了使用什么数据库、如果没指定,那么决定权就在爬虫程序员手里,如果自选的话,mysal 和mongodb 用的都是比较多的。但不同的数据库品种有各自的优缺点,不同的场景任何一种数据库都可以用来存储,但是某种可能会更好。比如如果抓取的数据之间的耦合性很高,关系比较复杂的话,那么mysal可能会是更好的选择。如果抓取的数据是分版块的,并且它们之间没有相似性或关联性不强,那么可能mongodb 会更好。mongoDB的生态、理念非常先进而且成熟、但是mongoDB不仅有开源版本,还有企业版本。所以有部分公司比较担心,哪天无法使用mongoDB了,所以也会产生一些替代产品。
2 查看文档
(1)比较运算# SQL:≡,!≡,>,=,30;db.user.find({\'age\':{\'$gt\':30}})(2)逻辑运算# SOL:and,or,not# MongoDB:字典中运号分隔的多个条件是and关系,\"$or\"的条件放到[]内,\"$not\"db.user.find({\'age\':{\"$gte\":20,\"$lt\":33}})db.user.find({\"addr.city\":\"青岛\",\"age\":{\"$gt\":30}})db.user.find({ \"$or\":[ {\"addr.city\":\"青岛\"}, {\"age\":{\"$gt\":30}} ]})#4、select *from dbl.user where id号 2=l;db.user.find({\'age\':{\"$mod\":[2,1]}})#5、上题,取反db.user.find( {\'age\':{\"$not\":{\"$mod\":[2,1]}}})(3)成员运算# SQL:in,not in# MongoDB:\"$in\",\"$nin\"db.user.find({\"age\":{\"$in\":[20,30,40南})db.user.find({\"name\":{\"$nin\":[\'张三\',\'\']}})(4)正则匹配# SQL:regexp 正则# MongoDB:/正则表达/idb.user.find({\'name\':/^张,*/i})(5)取指定字段db.user.find({\'name\':/^张,*/i},{\' id\':0,\'name\':l,\'age\':l})(6)查询数组#查看有dancing爱好的人db.user.find({\'hobbies\':\'dancing\'})# 查看既有dancing爱好又有tea爱好的人db.user.find( {\"hobbies\":{ \"$all\":[\'music\',\'dancing\'] }})(7)排序#排序:--1代表升序,-1代表降序db.user.find().sort({\"name\":l,})db.user.find().sort({\"age\":-1,\' id\':1})(8)分页#分页:--limit代表取多少个document,skip代表跳过前多少个documentdb.user.find().limit(1).skip(2)(9)查询数量# 获取数量db.user icount({\'age\':{\"$gt\":30}})--或者db.user.find({\'age\':{\"$gt\":30}}).count()(10)其它# 查找所有db.user.find()#等同于db.user.find({})db.user.find().pretty()#3、查找一个,与fina用法一致,只是只取匹配成功的第一个db.user.findone({\" id\":{\"$gt\":3}})
3 更新文档
- update:update的对象和一些更新的操作符(如$,$inc...等,相当于set后面的
- upsert:可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入
- multi:可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。
- writeConcern :可选,抛出异常的级别。
更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。
(1)覆盖更新#注意:除非是删除,否则 id是始终不会变的#1 :db.user.update({\'age\':20},{\"name\" :\"xxx\"})是用{\" id\":2,“name\":\"xxx\"}覆盖原来的记录#2、一种最简单的更新就是用一个新的文档完全替换匹配的文档。这适用于大规模式迁移的情况。例如var obj=db.user.findone({\"namè\":\"张三\"})obj.name=obj.name+\'先生obj.age++delete obj.hobbiesdb.user.update({\"nmae\":\"张三\"},obj)(2)局部更新#设置:$set通常文档只会有一部分需要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加后者删除db.user .update( {\'name\' : \"xxx\"},{\"$set\": {\"name\" :\"apple\",}} )# 没有匹配成功则新增一条{\"upsert\":true}db.user.update( {\'name\' :\"eric\"},{\"$set\":(\"name\" :\"eirc\",\"age\":18}},{\"upsert\":true))# 默认只改匹配成功的第一条,{\"multi\":改多条}db.user.update({\'age\':{\"$gt\":20}},{\"$set\":{\"age\":18}})db.user.update({\'age\':{\"$gt\":20}},{\"$set\":{\"age\":18}},{\"multi\":true) )#把名字为alex的人的地2个爱好改成piaodb.user.update( {\'name\':\"朱七\"},{\"$set\": (\"hobbies.1\":\"swimming\" }})#6、删除alex的爱好,Sunsetdb.user.update({\'name\':\"朱七\"},{\"$unset\":{\"hobbies\" :\"\"}})(3)自增或自减#增加和减少:$inc#1、所有人年龄增加一岁db.user.update({},{ \"sinc\":{\"age\":1}},{ \"multi\":true })#2、所有人年龄减少5岁db.user.update({},{ \"$inc\":{\"age\":-5}},{ \"multi\":true})(4)添加删除数组内元素#添加删除数组内元素:$push,$pop,$pu11往数组内添加元素:push# 为名字为朱七添加一个爱好pingpongdb.user.update( {\"name\":\"yuanhao\"},{\"$push\": {\"hobbies\":\"pingpong\"}} )# 按照条件删除元素,:\"$pu11”把符合条件的统统删掉,而$pop只能从两端删db.user.update({\'addr.country\':\"china\"},{\"$pull\":{\"hobbies\":\"read\"}}{ \"multi\":true})(5)避免重复添加#避免添加重复:\"$addToset\"db.urls.insert({\" id\":1,\"urls\":[ ]} )db.urls.update( {\" id\":1},{\"$addToSet\": {\"urls\" :\'http://www.baidu.com\'}} )db.urls .update( {\" id\" :1},{\"$addToSet\": {\"urls\" :\'http://www.baidu.com\'}} )db.urls.update({\" id\":1},{\"$addToset\": {\"urls\":\'http://www.baidu.com\'}})db.urls.update({\" id\":1},{ \"$addToSet\":{ \"urls\":{ \"seach\":[ \'http://www.baidu.com\', \'http://www.baidu.com\', \"http://www.xxxx.com\" ]}}})
4 删除文档
删除文档#1、删除多个中的第一个db.user.deleteone({\'age\':8})#2、删除国家为china的全部db.user.deleteMany({\'addr.country\':\'china\'})#3、删除全部db.user.deleteMany({})