百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

python爬虫----环境准备之mongodb

toyiye 2024-06-30 09:41 15 浏览 0 评论

简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。 在高负载的情况下,添加更多的节点,可以保证服务器性能。 MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。

主要特点

  • MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
  • 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
  • Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
  • Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
  • MongoDB安装简单。

数据库关键名称

  • admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

相关工具

  • MongoDB提供了网络和系统监控工具Munin,它作为一个插件应用于MongoDB中。
  • Gangila是MongoDB高性能的系统监视的工具,它作为一个插件应用于MongoDB中。
  • Fang of Mongo – 网页式,由Django和jQuery所构成。
  • Database Master — Windows的mongodb管理工具

安装

下载地址

www.mongodb.org/downloads

下载brew

首先下载 brew官网中的mongodb规则,

brew tap mongodb/brew
复制代码

下载成功时会有如下类似字眼:

==> Tapping mongodb/brew
Cloning into '/usr/local/Homebrew/Library/Taps/mongodb/homebrew-brew'...
remote: Enumerating objects: 67, done.
remote: Counting objects: 100% (67/67), done.
remote: Compressing objects: 100% (64/64), done.
remote: Total 570 (delta 23), reused 11 (delta 3), pack-reused 503
Receiving objects: 100% (570/570), 122.25 KiB | 149.00 KiB/s, done.
Resolving deltas: 100% (261/261), done.
Tapped 11 formulae (38 files, 195KB).
复制代码

安装mongodb

在这里,我们安装mongodb的4.4版本,可使用如下命令安装:

brew install mongodb-community@4.4
复制代码

安装成功后会有如下类似提示:

==> Installing mongodb/brew/mongodb-community
==> Caveats
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
==> Summary /usr/local/Cellar/mongodb-community/4.4.3: 11 files, 156.8MB, built in 6 seconds
==> Caveats
==> mongodb-community
To have launchd start mongodb/brew/mongodb-community now and restart at login:
  brew services start mongodb/brew/mongodb-community
Or, if you don't want/need a background service you can just run:
  mongod --config /usr/local/etc/mongod.conf
复制代码

根据提示可知道,后台运行mongodb的方式:

brew services start mongodb/brew/mongodb-community
复制代码

停止后台服务:

 brew services stop mongodb-community  
复制代码

前台运行的方式如下:

mongod --config /usr/local/etc/mongod.conf
复制代码

查看运行中的mongodb:

michaelkoo@MacBook work % ps -ef|grep mongodb
  501 80402     1   0 12:38下午 ??         0:02.62 /usr/local/opt/mongodb-community/bin/mongod --config /usr/local/etc/mongod.conf
  501 80648 79888   0 12:47下午 ttys002    0:00.00 grep mongodb
复制代码

由以上可知道,已在运行中。

几个关键文件说明

配置文件,/usr/local/etc/mongod.conf

日志目录:/usr/local/var/log/mongodb

数据目录:/usr/local/var/mongodb

测试

Mongodb自带的shell测试

可以直接在命令行下进入shell交互窗口

michaelkoo@MacBook ~ % mongo
MongoDB shell version v4.4.3
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("52ab0789-d65c-49a8-9f4c-2358c7f4abc1") }
MongoDB server version: 4.4.3
---
The server generated these startup warnings when booting: 
        2021-03-30T21:06:02.553+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
        2021-03-30T21:06:02.553+08:00: Soft rlimits too low
        2021-03-30T21:06:02.553+08:00:         currentValue: 256
        2021-03-30T21:06:02.553+08:00:         recommendedMinimum: 64000
---
---
        Enable MongoDB's free cloud-based monitoring service, which will then receive and display
        metrics about your deployment (disk utilization, CPU, operation statistics, etc).

        The monitoring data will be available on a MongoDB website with a unique URL accessible to you
        and anyone you share the URL with. MongoDB may use this information to make product
        improvements and to suggest MongoDB products and deployment options to you.

        To enable free monitoring, run the following command: db.enableFreeMonitoring()
        To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
复制代码

常见的shell命令

  • db.hostInfo(),查看当前数据库的主机信息
 db.hostInfo()
{
	"system" : {
		"currentTime" : ISODate("2021-04-01T02:25:51.925Z"),
		"hostname" : "MacBook.lan",
		"cpuAddrSize" : 64,
		"memSizeMB" : NumberLong(16384),
		"memLimitMB" : NumberLong(16384),
		"numCores" : 8,
		"cpuArch" : "x86_64",
		"numaEnabled" : false
	},
    ...
    ...
    
    	"extra" : {
		"versionString" : "Darwin Kernel Version 19.6.0: Mon Aug 31 22:12:52 PDT 2020; root:xnu-6153.141.2~1/RELEASE_X86_64",
		"alwaysFullSync" : 0,
		"nfsAsync" : 0,
		"model" : "MacBookPro15,2",
		"physicalCores" : 4,
		"cpuFrequencyMHz" : 2400,
		"cpuString" : "Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz",
		"cpuFeatures" : "FPU VME DE PSE TSC MSR PAE MCE CX8 APIC SEP MTRR PGE MCA CMOV PAT PSE36 CLFSH DS ACPI MMX FXSR SSE SSE2 SS HTT TM PBE SSE3 PCLMULQDQ DTES64 MON DSCPL VMX EST TM2 SSSE3 FMA CX16 TPR PDCM SSE4.1 SSE4.2 x2APIC MOVBE POPCNT AES PCID XSAVE OSXSAVE SEGLIM64 TSCTMR AVX1.0 RDRAND F16C SYSCALL XD 1GBPAGE EM64T LAHF LZCNT PREFETCHW RDTSCP TSCI",
		"pageSize" : 4096,
		"scheduler" : "dualq"
	},
	"ok" : 1
复制代码
  • db.stats(),查看数据库当前状态
> db.stats()
{
	"db" : "kk",
	"collections" : 2,
	"views" : 0,
	"objects" : 3,
	"avgObjSize" : 63,
	"dataSize" : 189,
	"storageSize" : 57344,
	"indexes" : 2,
	"indexSize" : 53248,
	"totalSize" : 110592,
	"scaleFactor" : 1,
	"fsUsedSize" : 167403245568,
	"fsTotalSize" : 250685575168,
	"ok" : 1
}
复制代码
  • db.getLastError(),查看最近的一个错误,如果没有则返回null
> db.getLastError()
null
复制代码
  • db,查询当前数据库,示例如下
> db
test
复制代码
  • show dbs,查看所有数据库,示例如下
> show dbs
admin   0.000GB
config  0.000GB
kk      0.000GB
local   0.000GB
test    0.000GB
复制代码
  • use xx,xx是某个库,切换到xx库,
> use kk
switched to db kk
复制代码
  • show tables,查询当前文档的所有集合
> show tables
col
kcol
复制代码
  • db.collection.count(),查询collection的数据量
> db.col.count()
2
> db.col.find()
{ "_id" : ObjectId("60652d50000178f64d7b2490"), "a" : "aaa", "b" : "bbb", "c" : "ccccc", "d" : "dddd" }
{ "_id" : ObjectId("60652d66000178f64d7b2491"), "a" : "a444", "b" : "333", "c" : "222", "d" : "111" }
复制代码
  • db.collection.stats(),查询集合的状态
> db.col.stats()
{
	"ns" : "kk.col",
	"size" : 136,
	"count" : 2,
	"avgObjSize" : 68,
	"storageSize" : 20480,
	"freeStorageSize" : 0,
	"capped" : false,
	...
	...
	"nindexes" : 1,
	"indexBuilds" : [ ],
	"totalIndexSize" : 20480,
	"totalSize" : 40960,
	"indexSizes" : {
		"_id_" : 20480
	},
	"scaleFactor" : 1,
	"ok" : 1
复制代码
  • 数据导出,mongoexport
mongoexport --jsonArray -o mon.json -d kk -c col
复制代码

以json数组形式导出kk库的col集合的所有数据到mon.json文件中

  • 数据导入,mongoimport
mongoimport --jsonArray --file mon.json -d kk -c kcol
connected to: mongodb://localhost/
2 document(s) imported successfully. 0 document(s) failed to import.
复制代码

以json数组的形式把mon.json里面的数据导入到kk库的 kcol集合中

查询

查询中有一些特殊的操作符需要注意:

操作符

格式

样例

相等(=)

{:{}}

db.test.find({'visit':24})

大于(>)

{:{$gt:}}

db.test.find({'visit':{$gt:18}})

小于(<)

{:{$lt:}}

db.test.find({'visit':{$lt:16}})

大于等于(>=)

{:{$gte:}}

db.test.find({'visit':{$gte:18}})

小于等于(<=)

{:{$lte:}}

db.test.find({'visit':{$lte:18}})

不等于(!=)

{:{$ne:}}

db.test.find({'visit':{$ne:16}})

{key01:value01,key02:value02,..}

db.test.find({'visit':18,'date':'2021-02-14'})

{$or:[{key01:value01},{key02:value02}...]}

db.test.find($or,[{'visit':10008},{'pv':18000}])

概括下查询相关的操作符 1.常规的比较查询操作符

$gt,大于
$lte,小于等于
$in,包含
$nin,不包含
$lt,小于
$gte,大于等于
$ne,不等于
$eq,等于
复制代码

2.常规的查询操作符

$mod,取模
$regex,正则
$text,文本
$where,条件
$and,
$nor,
$not,
$or
复制代码

3.元数据查询操作符

$type,数据类型操作符
$exists,判断字段是否存在操作符
复制代码

4.聚合操作符

$sum,
$avg,
$stdDevPop,$stdDevSamp,不解其意
$min,
$max,
$first,根据文档的排序获取第一个文档数据
$last,根据文档的排序获取最后一个文档数据
$push,在结果文档中插入值到一个数组中
$addToSet,在结果文档中插入值到一个数组中,但不创建副本
复制代码

添加

db.collection.insertOne({'key':'value'})
db.collection.insertMany([{'key01':'value01'},{'key02':'value 02'})

复制代码

说明: 第一条命令,是往集合中添加一条数据;

第二条命令,是往集合中添加多条数据,insertMany的参数是数组形式;

更新

db.collection.updateOne({'x': 1}, {'$inc': {'x': 3}})
db.collection.updateMany({'x': 1}, {'$inc': {'x': 3}})
db.collection.replaceOne({'x': 1}, {'y': 1})
复制代码

说明: 第一条命令,是把值为1的x更改为值加3,x=4

第二条命令,是把所有值为1的x更改为值加3,x=4

第三条命令,是把值为1的x更改y,改的是key,值不变

更新相关的操作符

名称

描述

$inc

自增操作符

min,min,min,max

最小操作符,最大操作符

$set

设置操作符

$unset

删除操作符,操作key及值

$rename

重命名操作符,修改key

删除

db.collection.deleteMany ({ 'ac' : "d" })
db.collection.deleteMany ({ 'ac' : {$regex:'a*'} })
db.collection.delete.One ({ 'ac' : "b" })
db.collection.deleteMany ({})
复制代码

说明: 第一个命令是删除ac值为d的数据

第二个命令是删除ac值为a开头的数据,这里使用了mongo 的关键词“$regex”,意思后面的值是正则表达式

最后一个是删除collection下面的所有数据

Mongo in python

安装pymongo库

pip install pymongo

复制代码

安装成功后:

Collecting pymongo
  Using cached pymongo-3.11.3-cp37-cp37m-macosx_10_6_intel.whl (414 kB)
Installing collected packages: pymongo
Successfully installed pymongo-3.11.3
复制代码

实例

import pymongo
import re
import time


def mongo_init():
    c = pymongo.MongoClient('mongodb://127.0.0.1/27017')
    k_c = c['kk']

    _create_data(k_c)

    _find_data(k_c)

    _update_data(k_c)

    _delete_data(k_c)

    pass


def _create_data(k_c):
    """
    添加数据,
    先查询是否存在,不存在才插入
    :param k_c:
    :return:
    """
    print('[*]      insert data     [*]')
    d = {'ab': 'abc'}
    if k_c['kcol'].find(d).count() <= 0:
        r = k_c['kcol'].insert_one(d)
        print(r.inserted_id, r.acknowledged, d)

    ac = {'ac': 'this is ac'}
    if k_c['kcol'].find(ac).count() <= 0:
        r = k_c['kcol'].insert(ac)
        print(f'insert ac :{r}')

    ad = {'ac': 'this is ac two'}
    if k_c['kcol'].find(ad).count() <= 0:
        r = k_c['kcol'].insert(ad)
        print(f'insert ad :{r}')
    pass


def _find_data(k_c):
    """
    查询数据,这里只列出最基本的查询操作,还有更多查询请参考官网
    :param k_c:
    :return:
    """
    print('\n[*]      find data       [*]')
    cols = k_c['kcol'].find_one({'ac': re.compile('a')})
    print(f'find one :{cols}\n')

    cols = k_c['kcol'].find().sort('ac')  # 无参数则表示查询全部
    cols.next()
    for i in cols:
        print(f'find many:{i}')
    pass


def _update_data(k_c):
    # 更新
    print('[*] update [*]')

    k_c['kcol'].update_many({'ac': re.compile('a')}, {'$set': {'ac': 'ad--update:' + str(time.time_ns())}})
    k_c['kcol'].replace_one({'ab': 'abc'}, {'ab_replace': 'abc is replace'})

    cols = k_c['kcol'].find({'ac': re.compile('a')})
    for col in cols:
        print(col)
    pass


def _delete_data(k_c):
    # 删除
    print('[*]      delete      [*]')
    f = {'ac': re.compile('ad')}
    f_data = k_c['kcol'].find(f)
    for fd in f_data:
        print(f'before del:{fd}')

    k_c['kcol'].delete_many(f)

    cols = k_c['kcol'].find({'ac': re.compile('')})
    for col in cols:
        print(col)
    pass

复制代码

运行结果如下:

/Users/michaelkoo/work/env/csdn/code/ImgBianhua/venv/bin/python /Users/michaelkoo/work/env/csdn/code/ImgBianhua/main.py
[*]      insert data     [*]
6064892a2243504a9c23cb8e True {'ab': 'abc', '_id': ObjectId('6064892a2243504a9c23cb8e')}
insert ac :6064892a2243504a9c23cb8f
insert ad :6064892a2243504a9c23cb90

[*]      find data       [*]
find one :{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'this is ac'}

find many:{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'this is ac'}
find many:{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'this is ac two'}
[*] update [*]
{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'ad--update:1617201450462799000'}
{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'ad--update:1617201450462799000'}
[*]      delete      [*]
before del:{'_id': ObjectId('6064892a2243504a9c23cb8f'), 'ac': 'ad--update:1617201450462799000'}
before del:{'_id': ObjectId('6064892a2243504a9c23cb90'), 'ac': 'ad--update:1617201450462799000'}

Process finished with exit code 0

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码