MongoDB

认识MongoDB

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

mongodb安装教程:https://www.cnblogs.com/zhoulifeng/p/9429597.html

mongodb相关操作:

数据库操作:

 > use blog
switched to db blog
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> db.article.insert({"title":"西游记"})
WriteResult({ "nInserted" : 1 })
> db.userinfo.insert({"name":"alex"})
WriteResult({ "nInserted" : 1 })
> show tables;
article
userinfo
> show dbs
admin 0.000GB
blog 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB
> db.dropDatabase()
{ "dropped" : "blog", "ok" : 1 }  

集合操作:

 > use blog
switched to db blog
> db.article.insert({"title":"python"})
WriteResult({ "nInserted" : 1 })
> db.article.insert({"title":"linux"})
WriteResult({ "nInserted" : 1 })
> show tables;
article
> db.article.drop()
true
> show tables;
>

文档操作:

  1.添加文档

复制代码
#1、没有指定_id则默认ObjectId,_id不能重复,且在插入后不可变 #2、插入单条
user0={
"name":"egon",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'BJ'
}
} db.test.insert(user0)
db.test.find() #3、插入多条
user1={
"_id":1,
"name":"alex",
"age":10,
'hobbies':['music','read','dancing'],
'addr':{
'country':'China',
'city':'weifang'
}
} user2={
"_id":2,
"name":"wupeiqi",
"age":20,
'hobbies':['music','read','run'],
'addr':{
'country':'China',
'city':'hebei'
}
} user3={
"_id":3,
"name":"yuanhao",
"age":30,
'hobbies':['music','drink'],
'addr':{
'country':'China',
'city':'heibei'
}
} user4={
"_id":4,
"name":"jingliyang",
"age":40,
'hobbies':['music','read','dancing','tea'],
'addr':{
'country':'China',
'city':'BJ'
}
} user5={
"_id":5,
"name":"jinxin",
"age":50,
'hobbies':['music','read',],
'addr':{
'country':'China',
'city':'henan'
}
}
db.user.insertMany([user1,user2,user3,user4,user5]) 
db.user.find()

  2.查询文档

###################### (1) 比较运算  ###################################

# SQL:=,!=,>,<,>=,<=
# MongoDB:{key:value}代表什么等于什么,"$ne","$gt","$lt","gte","lte",其中"$ne"能用于所有数据类型 #1、select * from db1.user where name = "alex";
db.user.find({'name':'alex'}) #2、select * from db1.user where name != "alex";
db.user.find({'name':{"$ne":'alex'}}) #3、select * from db1.user where id > 2;
db.user.find({'_id':{'$gt':2}}) #4、select * from db1.user where id < 3;
db.user.find({'_id':{'$lt':3}}) #5、select * from db1.user where id >= 2;
db.user.find({"_id":{"$gte":2,}}) #6、select * from db1.user where id <= 2;
db.user.find({"_id":{"$lte":2}}) ###################### (2) 逻辑运算 ################################### # SQL:and,or,not
# MongoDB:字典中逗号分隔的多个条件是and关系,"$or"的条件放到[]内,"$not" #1、select * from db1.user where id >= 2 and id < 4;
db.user.find({'_id':{"$gte":2,"$lt":4}}) #2、select * from db1.user where id >= 2 and age < 40;
db.user.find({"_id":{"$gte":2},"age":{"$lt":40}}) #3、select * from db1.user where id >= 5 or name = "alex";
db.user.find({
"$or":[
{'_id':{"$gte":5}},
{"name":"alex"}
]
})
#4、select * from db1.user where id % 2=1;
db.user.find({'_id':{"$mod":[2,1]}}) #5、上题,取反
db.user.find({'_id':{"$not":{"$mod":[2,1]}}})
###################### (3) 成员运算 ################################### # SQL:in,not in
# MongoDB:"$in","$nin" #1、select * from db1.user where age in (20,30,31);
db.user.find({"age":{"$in":[20,30,31]}}) #2、select * from db1.user where name not in ('alex','yuanhao');
db.user.find({"name":{"$nin":['alex','yuanhao']}}) ###################### (4) 正则匹配 ################################### # SQL: regexp 正则
# MongoDB: /正则表达/i #1、select * from db1.user where name regexp '^j.*?(g|n)$';
db.user.find({'name':/^j.*?(g|n)$/i}) ###################### (5) 取指定字段 ################################### #1、select name,age from db1.user where id=3;
db.user.find({'_id':3},{''name':1,'age':1})
#2 db.user.find({'_id':3},{"addr":0})
{ "_id" : 3, "name" : "yuanhao", "age" : 30, "hobbies" : [ "music", "drink" ] } ###################### (6) 查询数组 ################################### #1、查看有dancing爱好的人
db.user.find({'hobbies':'dancing'}) #2、查看既有dancing爱好又有tea爱好的人
db.user.find({
'hobbies':{
"$all":['dancing','tea']
}
}) #3、查看第4个爱好为tea的人
db.user.find({"hobbies.3":'tea'}) #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().sort({"name":1,})
db.user.find().sort({"age":-1,'_id':1}) ###################### (8) 分页 ################################### # 分页:--limit代表取多少个document,skip代表跳过前多少个document。
db.user.find().sort({'age':1}).limit(1).skip(2) ###################### (9) 查询数量 ###################################
# 获取数量
db.user.count({'age':{"$gt":30}}) --或者
db.user.find({'age':{"$gt":30}}).count() ###################### (10) 其它 ################################### #1、{'key':null} 匹配key的值为null或者没有这个key
db.t2.insert({'a':10,'b':111})
db.t2.insert({'a':20})
db.t2.insert({'b':null}) > db.t2.find({"b":null})
{ "_id" : ObjectId("5a5cc2a7c1b4645aad959e5a"), "a" : 20 }
{ "_id" : ObjectId("5a5cc2a8c1b4645aad959e5b"), "b" : null } #2、查找所有
db.user.find() #等同于db.user.find({})
db.user.find().pretty() #3、查找一个,与find用法一致,只是只取匹配成功的第一个
db.user.findOne({"_id":{"$gt":3}}) 

  3.修改文档

复制代码
############################## 1 update的语法 ############################## update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
参数说明:对比update db1.t1 set name='EGON',sex='Male' where name='egon' and age=18; query : 相当于where条件。
update : update的对象和一些更新的操作符(如$,$inc...等,相当于set后面的
upsert : 可选,默认为false,代表如果不存在update的记录不更新也不插入,设置为true代表插入。
multi : 可选,默认为false,代表只更新找到的第一条记录,设为true,代表更新找到的全部记录。
writeConcern :可选,抛出异常的级别。 更新操作是不可分割的:若两个更新同时发送,先到达服务器的先执行,然后执行另外一个,不会破坏文档。 ############################## 2 覆盖更新 ############################## #注意:除非是删除,否则_id是始终不会变的
#1 :
db.user.update({'age':20},{"name":"Wxx","hobbies_count":3})
是用{"_id":2,"name":"Wxx","hobbies_count":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) ############################## 3 局部更新 ############################## #设置:$set 通常文档只会有一部分需要更新。可以使用原子性的更新修改器,指定对文档中的某些字段进行更新。
更新修改器是种特殊的键,用来指定复杂的更新操作,比如修改、增加后者删除 #1、update db1.user set name="WXX" where id = 2
db.user.update({'_id':2},{"$set":{"name":"WXX",}}) #2、没有匹配成功则新增一条{"upsert":true}
db.user.update({'_id':6},{"$set":{"name":"egon","age":18}},{"upsert":true}) #3、默认只改匹配成功的第一条,{"multi":改多条}
db.user.update({'_id':{"$gt":4}},{"$set":{"age":28}})
db.user.update({'_id':{"$gt":4}},{"$set":{"age":38}},{"multi":true}) #4、修改内嵌文档,把名字为alex的人所在的地址国家改成Japan
db.user.update({'name':"alex"},{"$set":{"addr.country":"Japan"}}) #5、把名字为alex的人的地2个爱好改成piao
db.user.update({'name':"alex"},{"$set":{"hobbies.1":"piao"}}) #6、删除alex的爱好,$unset
db.user.update({'name':"alex"},{"$unset":{"hobbies":""}}) ############################## 4 自增或自减 ############################## #增加和减少:$inc #1、所有人年龄增加一岁
db.user.update({},
{
"$inc":{"age":1}
},
{
"multi":true
}
)
#2、所有人年龄减少5岁
db.user.update({},
{
"$inc":{"age":-5}
},
{
"multi":true
}
) ############################## 5 添加删除数组内元素 ############################## #添加删除数组内元素:$push,$pop,$pull 往数组内添加元素:$push
#1、为名字为yuanhao的人添加一个爱好read
db.user.update({"name":"yuanhao"},{"$push":{"hobbies":"read"}}) #2、为名字为yuanhao的人一次添加多个爱好tea,dancing
db.user.update({"name":"yuanhao"},{"$push":{
"hobbies":{"$each":["tea","dancing"]}
}}) 按照位置且只能从开头或结尾删除元素:$pop
#3、{"$pop":{"key":1}} 从数组末尾删除一个元素 db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":1}
}) #4、{"$pop":{"key":-1}} 从头部删除
db.user.update({"name":"yuanhao"},{"$pop":{
"hobbies":-1}
}) #5、按照条件删除元素,:"$pull" 把符合条件的统统删掉,而$pop只能从两端删
db.user.update({'addr.country':"China"},{"$pull":{
"hobbies":"read"}
},
{
"multi":true
}
) ############################## 6 避免重复添加 ############################## #避免添加重复:"$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":{
"$each":[
'http://www.baidu.com',
'http://www.baidu.com',
'http://www.xxxx.com'
]
}
}
}
) ############################## 7 其它 ############################## #1、了解:限制大小"$slice",只留最后n个 db.user.update({"_id":5},{
"$push":{"hobbies":{
"$each":["read",'music','dancing'],
"$slice":-2
}
}
}) #2、了解:排序The $sort element value must be either 1 or -1"
db.user.update({"_id":5},{
"$push":{"hobbies":{
"$each":["read",'music','dancing'],
"$slice":-1,
"$sort":-1
}
}
}) #注意:不能只将"$slice"或者"$sort"与"$push"配合使用,且必须使用"$eah"  

  4.删除文档

#1、删除多个中的第一个
db.user.deleteOne({ 'age': 8 }) #2、删除国家为China的全部
db.user.deleteMany( {'addr.country': 'China'} ) #3、删除全部
db.user.deleteMany({})

Pymong模块

import pymongo
1 连接mongo数据库
client = pymongo.MongoClient(host='localhost', port=27017) 2 获取数据库以及集合
db=client.spider
collection = db.students ############################### 添加文档 ############################
3 添加一个文档
student = {
'id': '',
'name': 'alex',
'age': 38,
'gender': 'male'
}
方式1:
result = collection.insert_one(student)
方式2:
collection.save(student) print(collection.find())
for el in collection.find():
print(el) 3 添加多个文档
student1 = {
'id': '',
'name': 'Amy',
'age': 20,
'gender': 'male'
} student2 = {
'id': '',
'name': 'Mike',
'age': 21,
'gender': 'male'
} ret = collection.insert_many([student1,student2])
for el in collection.find():
print(el) ############################### 查询文档 ############################
1如果要查询年龄大于20的数据,则写法如下:
ret = collection.find({"age":{"$gt":20}}) 2. 计数
要统计查询结果有多少条数据,可以调用count()方法,如统计所有数据条数
ret = collection.find({"age":{"$gt":20}}).count()
print(ret) 3. 排序
可以调用sort方法,传入排序的字段及升降序标志即可,示例如下:
ret = collection.find().sort("age",pymongo.ASCENDING) 4.偏移,可能想只取某几个元素,在这里可以利用skip()方法偏移几个位置,比如偏移2,就忽略前2个元素,得到第三个及以后的元素。
ret = collection.find().sort('name', pymongo.ASCENDING).skip(2) 5.另外还可以用limit()方法指定要取的结果个数,示例如下: ret = collection.find().sort('name', pymongo.ASCENDING).skip(2).limit(2) ############################### 更新文档 ############################
覆盖更新
ret = collection.update({"name":"Mike"},{"xxx":'yyy'})
局部更新
collection.update({"name":"Amy"},{"$set":{"age":100}})
collection.update_many({},{"$inc":{"age":20}}) ############################### 删除文档 ############################
result = collection.remove({'xxx': 'yyy'}) 两个新的推荐方法,delete_one()和delete_many()方法
result = collection.delete_one({'xxx': 'yyy'})
result = collection.delete_many({'age': {'$lt': 50}})

详细内容可查看:https://www.cnblogs.com/pyedu/p/10313148.html

04 爬虫数据存储之Mongodb的更多相关文章

  1. Python爬虫框架Scrapy实例(三)数据存储到MongoDB

    Python爬虫框架Scrapy实例(三)数据存储到MongoDB任务目标:爬取豆瓣电影top250,将数据存储到MongoDB中. items.py文件复制代码# -*- coding: utf-8 ...

  2. python3下scrapy爬虫(第十一卷:scrapy数据存储进mongodb)

    说起python爬虫数据存储就不得不说到mongodb,现在我们来试一下scrapy操作mongodb 首先开启mongodb mongod --dbpath=D:\mongodb\db 开启服务后就 ...

  3. scrapy抓取拉勾网职位信息(七)——数据存储(MongoDB,Mysql,本地CSV)

    上一篇完成了随机UA和随机代理的设置,让爬虫能更稳定的运行,本篇将爬取好的数据进行存储,包括本地文件,关系型数据库(以Mysql为例),非关系型数据库(以MongoDB为例). 实际上我们在编写爬虫r ...

  4. 爬虫数据存储——安装docker和ElasticSearch(基于Centos7)

    爬虫数据存储--安装docker和ElasticSearch(基于Centos7) 先决条件 操作系统要求 要安装Docker Engine-Community,您需要一个CentOS 7的维护版本. ...

  5. 【18】如何把数据存储到MongoDB数据库

    如何把数据存储到MongoDB数据库 时间:2018.10.31                   edit by :北鼻 一.mongoDB环境安装 需要使用mongoDB数据库的话需要安装环境, ...

  6. Spring Boot 揭秘与实战(二) 数据存储篇 - MongoDB

    文章目录 1. 环境依赖 2. 数据源 2.1. 方案一 使用 Spring Boot 默认配置 2.2. 方案二 手动创建 3. 使用mongoTemplate操作4. 总结 3.1. 实体对象 3 ...

  7. Scrapy爬虫案例 | 数据存储至MongoDB

    豆瓣电影TOP 250网址 要求: 1.爬取豆瓣top 250电影名字.演员列表.评分和简介 2.设置随机UserAgent和Proxy 3.爬取到的数据保存到MongoDB数据库  items.py ...

  8. pymysql-python爬虫数据存储准备

    mongodb 和mysql 在使用哪个数据库 来存储数据上 小哥还是纠结了一下下. 很多爬虫教程都推荐mongodb 优势是速度快 因为我已经本机安装了一下 php开发环境,mysql是现成的, s ...

  9. selenium爬取NBA并将数据存储到MongoDB

    from selenium import webdriver driver = webdriver.Chrome() url = 'https://www.basketball-reference.c ...

随机推荐

  1. bzoj 2527: [Poi2011]Meteors

    昨天写了一晚,越写复杂度越感觉不对,早上一想果然是假的. (这里n,m,k我就不区分了) 首先一个城市的询问可以很容易的二分 check用树状数组维护区间(区间修改,单点查询的那种) 一次是\(O(n ...

  2. Vue脚手架创建项目

    创建一个基于webpack模板的新项目 D:\Git $ vue -V D:\Git $ vue init webpack my-project ? Project name my-project ? ...

  3. SQLServer2014 安装错误:等待数据库引擎恢复句柄失败

    查了很多资料最后靠百度百科里的一票报道彻底解决困难.在次发表一下以便给后人排忧解难 已下为百度连接 https://jingyan.baidu.com/article/7908e85cb24c19af ...

  4. p3792 由乃与大母神原型和偶像崇拜(思维+线段树)

    要求 1.修改x位置的值为y 2.查询区间l,r是否可以重排为值域上连续的一段 可以,很lxl 然后一开始思考合并区间,但是发现可以重排序,GG 然后想了特殊性质,比如求和,但是显然可以被叉 这时候我 ...

  5. Nuget 打包 for .Net Standart project

    Create .NET Standard packages with Visual Studio 2015 Publishing packages nuge.exe 放在项目目录中 nuget spe ...

  6. 【前端开发工具】WijmoJS 2018 v3 正式发布,全面支持Angular7

    WijmoJS(前端开发工具包)2018年度第三个大版本已经正式发布,本次更新除了全面支持Angular7之外,还允许用户使用Web Workers在前端更高效地导出PDF.智能的分组表头属性.全新的 ...

  7. 《算法竞赛入门经典》刘汝佳 C语言部分(前四章)“注解与习题” 之思索 -<1>

    此书我购于去年的十一月份,也是经前人推荐购买的一本比较有用的书籍,在寒假自学此书,其简洁清晰高效的示例代码令我印象深刻,于是我打算把这本书的前四章后面的注解与习题(未给出标准解答)认真的去思索和研究, ...

  8. Qt实在太漂亮了

    我很久之前就想用Qt,无奈对c++不熟悉,学习代价太大.想使用pyqt曲线救国,搞了好久的环境后放弃了.昨天又看了个很漂亮的qt例子,太漂亮了,让我很想进圈子.就从现在开始吧!!

  9. HDU 4309 Seikimatsu Occult Tonneru(最大流+二进制枚举)

    http://acm.hdu.edu.cn/showproblem.php?pid=4309 题意: 有n个城市,每个城市有num[i]个居民,有敌人要进行地毯式轰击,居民们要逃到隧道去.现在有隧道, ...

  10. linux 进阶命令笔记(12月26日)

    1. df 指令 作用:查看磁盘空间 用法: #df -h       -h 表示以可读性较高的形式展示大小   2.free 指令 作用:查看内存使用情况 语法:#free -m       -m表 ...