爬虫系列之mongodb

    科技2022-09-07  118

    mongodb

    MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

    MongoDB的CURD

    数据库操作

    显示所有数据库 show dbs 切换数据库(如果要切换的数据库不存在则创建) use 数据库名 在数据库中增加集合(表) db.表名.insert(数据) 删除数据库 db.dropDatebase()

    集合操作

    显示该数据库中的所有集合 show tables; 删除数据库中的集合 db.表名.drop()

    文档操作

    添加文档

    注意如果没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变

    插入单条

    user0={ "name":"ys", "age":29, 'hobbies':['game','book','match'], 'addr':{ 'country':'China', 'city':'HN' } } use test db.user.insert(user0) db.user.find()

    插入多条

    user1={ "_id":1, "name":"ys", "age":29, 'hobbies':['book','game','match'], 'addr':{ 'country':'China', 'city':'HN' } } user2={ "_id":2, "name":"ymt", "age":29, 'hobbies':['music','book','TV'], 'addr':{ 'country':'China', 'city':'HN' } } user3={ "_id":3, "name":"yyh", "age":3, 'hobbies':['game','paly','TV'], 'addr':{ 'country':'China', 'city':'HN' } } user4={ "_id":4, "name":"yzm", "age":1, 'hobbies':['sleep','milk','play'], 'addr':{ 'country':'China', 'city':'HN' } } user5={ "_id":5, "name":"yzt", "age":1, 'hobbies':['sleep','milk','play'], 'addr':{ 'country':'China', 'city':'HN' } } db.user.insertMany([user1,user2,user3,user4,user5]) db.user.find()

    查看文档

    1.比较运算

    # SQL:=,!=,>,<,>=,<= # MongoDB:{key:value}代表什么等于什么 # "$ne","$gt","$lt","gte","lte",其中"$ne"能用于所有数据类型 # 1.select * from user where name = "ys"; db.user.find({"name":"ys"})

    # 2.select * from user where name !="ys"; db.user.find({"name":{"$ne":"ys"}})

    # 3.select * from user where id > 2; db.user.find({"_id":{"$gt":2}})

    # 4.select * from user where id < 3; db.user.find({"_id":{"$lt":3}})

    # 5 select * from user where id >= 2; db.user.find({"_id":{"$gte":2}})

    # 6 select * from user where id <=2; db.user.find({"_id":{"$lte":2}})

    2.逻辑运算

    # SQL:and or not % # MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到{}内,$not,$mod类似 # 1 select * from user where id>=2 and id < 4; db.user.find({"_id":{"$gte":2,"$lt":4}})

    # 2 select * from user where id >= 2 and age < 20; db.user.find({"_id":{"$gte":2},"age":{"$lt":20}})

    # 3 select * from user where id >=5 or name = "yzm"; db.user.find({"$or":[{"_id":{"$gte":5}},{"name":"yzm"}]})

    # 4 select * from user where id % 2 = 1; db.user.find({"_id":{"$mod":[2,1]}})

    # 5 select * from user where id % 2 != 1; db.user.find({"_id":{"$not":{"$mod":[2,1]}}})

    3.成员运算

    # SQL in,not in # MongoDB $in $nin # 1 select * from user where age in (1,2,3); db.user.find({"age":{"$in":[1,2,3]}})

    # select * from user where name not in ('yzt','yzm'); db.user.find({"name":{"$nin":['yzt','yzm']}})

    4.正则匹配

    # SQL regexp 正则 # MongoDB /正则表达式/i # 1 select * from user where name regexp '^y.*?(m|t)$'; db.user.find({"name":/^y.*?(m|t)$/i})

    5.取指定字段

    # 1 select name,age from user where id=3; # 字段:1 显示该字段 字符:0 不显示该字段 db.user.find({"_id":3},{'name':1,'age':1})

    db.user.find({"_id":3},{"addr":0})

    6.查询数组

    # 1 查看有sleep爱好的人 db.user.find({"hobbies":"sleep"})

    # 2 查看既有TV爱好又有music爱好的人 db.user.find({"hobbies":{"$all":["TV","music"]}})

    # 3 查看第3个爱好为play的人 db.user.find({"hobbies.2":"play"})

    # 4 查看所有人最后两个爱好 db.user.find({},{"hobbies":{"$slice":-2},"age":0,"_id":0,"name":0,"addr":0})

    # 5 查看所有人的第2个到第3个爱好 db.user.find({},{"hobbies":{"$slice":[1,2]},"age":0,"_id":0,"name":0,"addr":0})

    7.排序

    # 排序: 1代表升序 -1代表降序 db.user.find({},{"name":1,"age":1,"_id":0}).sort({"age":1})

    # 如果年龄一直,则按照id从大到小排序 db.user.find({},{"name":1,"age":1}).sort({"age":1,"_id":-1})

    8.分页

    # 分页: limit代表取多少个文档 skip代表跳过多少个文档 db.user.find().limit(2)

    # 跳过第一个 取下面的2个 db.user.find().limit(2).skip(1)

    9.查询数量

    db.user.find({"age":{"$gte":20}}).count()

    10.其他查询

    # 1 如果匹配的值为null,那么得到的结果为没有这个key的和有个key但是值为null的 db.user.insert({"hope":"healthy"}) db.user.insert({"hope":null})

    # 2 查找所有 db.user.find() #等于 db.user.find({}) db.user.find().pretty() # json输出 # 3 查找匹配成功的第一个 db.user.findOne({"_id":{"$gt":3}})

    修改文档

    1.覆盖更新

    # 除非是删除 否则_id是始终不会变的 db.user.update({"age":3},{"name":"yyhbb"}) # 找到年龄为3岁的 然后整条覆盖

    # 2 一种最简单的更新就是用一个新的文档替换匹配的文档 # 这适用于大规模迁移的情况 var obj=db.user.findOne({"_id":2}) obj.username=obj.name+'SB' obj.hobbies_count++ delete obj.age db.user.update({"_id":2},obj)

    2.局部更新

    通常文档只会一部分需要更新。可以使用原子性的更新修改器。指定对文档中的某些字段进行更新。更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改增加或者删除。

    # 1 update user set name="yyh" where id = 3; db.user.update({"_id":3},{"$set":{"name":"yyh"}})

    # 2 没有匹配成功则新增一条 {"upsert":true} db.user.update({"_id":6},{"$set":{"name":"ycy","age":63}},{"upsert":true})

    # 3 默认只改匹配成功的第一条 # {"multi":true} 改多条 db.user.update({"name":"ys"},{"$set":{"name":"ystest"}}) db.user.update({"name":"ys"},{"$set":{"name":"ys1111111"}},{"multi":true})

    # 4 修改内嵌文档 (字典) db.user.update({"name":"ys1111111"},{"$set":{"addr.city":"HNLH"}})

    # 5 修改内嵌文档(列表) db.user.update({"name":"ys1111111"},{"$set":{"hobbies.2":"TV"}})

    # 6 删除ys1111111的爱好 $unset db.user.update({"name":"ys1111111"},{"$unset":{"hobbies":""}})

    3.自增或自减

    # $inc # 1 所有人年龄增加一岁 # 有该字段的自动增加1 没有该字段的创建该字段,并且值为1 db.user.update({},{"$inc":{"age":1}},{"multi":true})

    # 2 所有人年龄减少2岁 db.user.update({},{"$inc":{"age":-2}},{"multi":true})

    4.添加或删除组内元素

    # 添加删除数组内元素: $push $pop $pull # 在数组内添加元素 $push # 1 名字为ys的人添加一个爱好read db.user.update({"name":"ys"},{"$push":{"hobbies":"read"}})

    # $pop 安装位置且只能从开头或结尾删除元素 db.user.update({"name":"ys"},{"$pop":{"hobbies":1}}) # 从尾部删 db.user.update({"name":"ys"},{"$pop":{"hobbies":-1}}) # 从首部删

    # $pull 把符合条件的统统删掉 db.user.update({'addr.country':"China"},{"$pull":{"hobbies":"read"}},{"multi":true})

    删除文档

    # 1 删除多个中的第一个 db.user.deleteOne({"age":29})

    # 2 删除国家为China的全部 db.user.deleteMany( {'addr.country': 'China'} ) # 3 删除全部 db.user.deleteMany({})

    pymongo

    在这里我们来看一下Python3下MongoDB的存储操作,在开始之前请确保你已经安装好了MongoDB并启动了其服务,另外安装好了Python的PyMongo库。 pip install pymongo

    连接MongoDB

    import pymongo client = pymongo.MongoClient(host='localhost', port=27017) # 给客户端指定要操作的是哪个数据库 这里是test数据库 db = client.test # 指定数据库后,选择数据库中要操作的表 collection = db.user # 插入数据 info= { '_id': '10', 'name': 'ycy', 'age': 63 } result = collection.insert_one(info)
    Processed: 0.016, SQL: 9