MongoDB(一):Python-windows下mongodb安装与使用整理

序言:

本博客通过六大方面介绍如下内容:

  • 前言介绍:介绍了包含MongoDB、NoSQL、关系型数据库和非关系型数据的优缺点等内容。
  • Windows 平台安装MongoDB:介绍了如何在Windows下安装MongoDB,学习python时可能会遇到安装MongoDB,对于习惯了使用Windows的人有一定的帮助。
  • Python中安装pymongo:供python爬虫使用
  • 安装mongoengine(通常django用此依赖操作mongodb)
  • MongoDB数据库的使用:介绍了一些简单的使用,查找数据库、增加、删除、修改、查找等命令的使用。
  • MongoDB高级应用:包含条件查找、排序等内容的实例使用。

    其中二、Windows 平台安装MongoDB,三、Python中安装pymongo,四、安装mongoengine,

    这三步用于Python中使用MongoDB的操作。可以针对Python学习。

一、前言介绍

1、什么是MongoDB ?

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

MongoDB是非关系型数据库(NoSQL)。

在高负载的情况下,添加更多的节点,可以保证服务器性能。

MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

2、什么是NoSQL?

NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。

NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

3、为什么使用NoSQL ?

今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。

4、RDBMS vs NoSQL

RDBMS (关系型数据库管理系统
- 高度组织化结构化数据 
- 结构化查询语言(SQL) (SQL) 
- 数据和关系都存储在单独的表中。 
- 数据操纵语言,数据定义语言 
- 严格的一致性
- 基础事务

NoSQL  (非关系型数据库管理系统
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理 
- 高性能,高可用性和可伸缩性

5、关系型数据库遵循ACID规则

事务在英文中是transaction,和现实世界中的交易很类似,它有如下四个特性:

5.1、A (Atomicity) 原子性

原子性很容易理解,也就是说事务里的所有操作要么全部做完,要么都不做,事务成功的条件是事务里的所有操作都成功,只要有一个操作失败,整个事务就失败,需要回滚。

比如银行转账,从A账户转100元至B账户,分为两个步骤:1)从A账户取100元;2)存入100元至B账户。这两步要么一起完成,要么一起不完成,如果只完成第一步,第二步失败,钱会莫名其妙少了100元。

5.2、C (Consistency) 一致性

一致性也比较容易理解,也就是说数据库要一直处于一致的状态,事务的运行不会改变数据库原本的一致性约束。

例如现有完整性约束a+b=10,如果一个事务改变了a,那么必须得改变b,使得事务结束后依然满足a+b=10,否则事务失败。

5.3、I (Isolation) 独立性

所谓的独立性是指并发的事务之间不会互相影响,如果一个事务要访问的数据正在被另外一个事务修改,只要另外一个事务未提交,它所访问的数据就不受未提交事务的影响。

比如现在有个交易是从A账户转100元至B账户,在这个交易还未完成的情况下,如果此时B查询自己的账户,是看不到新增加的100元的。

5.4、D (Durability) 持久性

持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。

6、NoSQL的优点/缺点

优点:

  • - 高可扩展性
  • - 分布式计算
  • - 低成本
  • - 架构的灵活性,半结构化数据
  • - 没有复杂的关系

缺点:

  • - 没有标准化
  • - 有限的查询功能(到目前为止)
  • - 最终一致是不直观的程序

7、NoSQL 数据库分类

二、Windows 平台安装MongoDB

1、MongoDB下载

你可以在mongodb官网下载该安装包,地址为:https://www.mongodb.com/download-center#community。MonggoDB支持以下平台:

  • OS X 32-bit
  • OS X 64-bit
  • Linux 32-bit
  • Linux 64-bit
  • Windows 32-bit
  • Windows 64-bit
  • Solaris i86pc
  • Solaris 64

2、创建数据目录

MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。

在本教程中,我已经在D盘安装了 mongodb,现在让我们创建一个 data 的目录,然后在 data 目录里创建 db 目录。

3、命令行下运行 MongoDB 服务器

为了从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。

即在D:\Program Files (x86)\MongoDB\bin目录下打开命令行,执行下面命令,配置db。

mongod.exe --dbpath "D:\Program Files (x86)\MongoDB\data\db"     //目录中有空格要加双引号在路径上

如果执行成功,会输出如下信息:

2015-09-25T15:54:09.212+0800 I CONTROL  Hotfix KB2731284 or later update is not
installed, will zero-out data files
2015-09-25T15:54:09.229+0800 I JOURNAL  [initandlisten] journal dir=c:\data\db\j
ournal
2015-09-25T15:54:09.237+0800 I JOURNAL  [initandlisten] recover : no journal fil
es present, no recovery needed
2015-09-25T15:54:09.290+0800 I JOURNAL  [durability] Durability thread started
2015-09-25T15:54:09.294+0800 I CONTROL  [initandlisten] MongoDB starting : pid=2
488 port=27017 dbpath=c:\data\db 64-bit host=WIN-1VONBJOCE88
2015-09-25T15:54:09.296+0800 I CONTROL  [initandlisten] targetMinOS: Windows 7/W
indows Server 2008 R2
2015-09-25T15:54:09.298+0800 I CONTROL  [initandlisten] db version v3.0.6
……

4、连接MongoDB

我们可以在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:

D:\Program Files (x86)\MongoDB\bin\mongo.exe    //即在bin目录下打开命令行 运行mongo.exe

5、配置 MongoDB 服务

管理员模式打开命令行窗口

创建目录,执行下面的语句来创建数据库和日志文件的目录

mkdir D:\Program Files (x86)\MongoDB\data\db         //创建db数据库目录
mkdir D:\Program Files (x86)\MongoDB\data\log        //创建log日志文件目录

创建配置文件

创建一个配置文件。该文件必须设置 systemLog.path 参数,包括一些附加的配置选项更好。

例如,创建一个配置文件位于 D:\Program Files (x86)\MongoDB\mongod.cfg,其中指定 systemLog.path 和 storage.dbPath。

具体配置内容如下:

systemLog:
    destination: file
    path: D:\Program Files (x86)\MongoDB\data\log\MongoDB.log
storage:
    dbPath: D:\Program Files (x86)\MongoDB\data\db

6、安装 MongoDB服务

通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。

D:\Program Files (x86)\MongoDB\bin\mongod.exe --config "C:\mongodb\mongod.cfg" --install
//即在D:\Program Files (x86)\MongoDB\bin\目录下执行下面命令
//mongod.exe --config "C:\mongodb\mongod.cfg" --install

要使用备用 dbpath,可以在配置文件(例如:D:\Program Files (x86)\MongoDB\mongod.cfg)或命令行中通过 --dbpath 选项指定。

如果需要,您可以安装 mongod.exe 或 mongos.exe 的多个实例的服务。只需要通过使用 --serviceName 和 --serviceDisplayName 指定不同的实例名。只有当存在足够的系统资源和系统的设计需要这么做。

启动MongoDB服务

net start MongoDB

关闭MongoDB服务

net stop MongoDB

移除 MongoDB 服务

C:\mongodb\bin\mongod.exe --remove

7、MongoDB 后台管理 Shell

如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。

当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):

> mongo
MongoDB shell version: 3.0.6
connecting to: test
……

由于它是一个JavaScript shell,您可以运行一些简单的算术运算:

> 2 + 2
4
>

db 命令用于查看当前操作的文档(数据库):

> db
test
>

插入一些简单的记录并查找它:

> db.runoob.insert({x:10})
WriteResult({ "nInserted" : 1 })
> db.runoob.find()
{ "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 }
>

第一个命令将数字 10 插入到 runoob 集合的 x 字段中。

三、Python中安装pymongo

在安装python的Scripts目录下,执行下面命令:

//  pip安装
$ python -m pip install pymongo
// easy_install安装
$ python -m easy_install pymongo
// 下载git源安装
$ python setup.py install

test_connection.py

>>> import pymongo
>>> client = pymongo.MongoClient("localhost", 27017)
>>> db = client.test
>>> db.name
u'test'
>>> db.my_collection
Collection(Database(MongoClient('localhost', 27017), u'test'), u'my_collection')
>>> db.my_collection.insert_one({"x": 10}).inserted_id
ObjectId('4aba15ebe23f6b53b0000000')
>>> db.my_collection.insert_one({"x": 8}).inserted_id
ObjectId('4aba160ee23f6b543e000000')
>>> db.my_collection.insert_one({"x": 11}).inserted_id
ObjectId('4aba160ee23f6b543e000002')
>>> db.my_collection.find_one()
{u'x': 10, u'_id': ObjectId('4aba15ebe23f6b53b0000000')}
>>> for item in db.my_collection.find():
...     print(item["x"])
...

四、安装mongoengine(通常django用此依赖操作mongodb)

pymongo来操作MongoDB数据库,但是直接把对于数据库的操作代码都写在脚本中,这会让应用的代码耦合性太强,而且不利于代码的优化管理

MongoEngine是一个对象文档映射器(ODM),相当于一个基于SQL的对象关系映射器(ORM)

MongoEngine提供的抽象是基于类的,创建的所有模型都是类

Examples

from mongoengine import *
connect('test')

class BlogPost(Document):
    title = StringField(required=True, max_length=200)
    posted = DateTimeField(default=datetime.datetime.utcnow)
    tags = ListField(StringField(max_length=50))
    meta = {'allow_inheritance': True}

class TextPost(BlogPost):
    content = StringField(required=True)

class LinkPost(BlogPost):
    url = StringField(required=True)

# Create a text-based post
>>> post1 = TextPost(title='Using MongoEngine', content='See the tutorial')
>>> post1.tags = ['mongodb', 'mongoengine']
>>> post1.save()

# Create a link-based post
>>> post2 = LinkPost(title='MongoEngine Docs', url='hmarr.com/mongoengine')
>>> post2.tags = ['mongoengine', 'documentation']
>>> post2.save()

五、MongoDB数据库的使用

1. 常用的命令

  • show dbs    显示数据库列表
  • use dbname    进入dbname数据库,大小写敏感,没有这个数据库也不要紧
  • show collections    显示数据库中的集合,相当于表格

2. 创建&新增

  • db.users.save({"name":"lecaf"})    创建了名为users的集合,并新增了一条{"name":"lecaf"}的数据
  • db.users.insert({"name":"ghost", "age":10})    在users集合中插入一条新数据,,如果没有users这个集合,mongodb会自动创建
  • save()和insert()也存在着些许区别:若新增的数据主键已经存在,insert()会不做操作并提示错误,而save() 则更改原来的内容为新内容。
    • 存在数据:{ _id : 1, " name " : " n1 "} ,_id是主键
    • insert({ _id : 1, " name " : " n2 " })    会提示错误
    • save({ _id : 1, " name " : " n2 " })     会把 n1 改为  n2 ,有update的作用。

3. 删除

  • db.users.remove()    删除users集合下所有数据
  • db.users.remove({"name": "lecaf"})    删除users集合下name=lecaf的数据
  • db.users.drop()或db.runCommand({"drop","users"})    删除集合users
  • db.runCommand({"dropDatabase": 1})    删除当前数据库

4. 查找

  • db.users.find()    查找users集合中所有数据
  • db.users.findOne()    查找users集合中的第一条数据

5. 修改

  • db.users.update({"name":"lecaf"}, {"age":10})    修改name=lecaf的数据为age=10,第一个参数是查找条件,第二个参数是修改内容,除了主键,其他内容会被第二个参数的内容替换,主键不能修改。

6. 实例

> show dbs            //显示数据库列表
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB

> use test            //进入test数据库,大小写敏感,没有这个数据库也不要紧
switched to db test

> show collections    //显示数据库中的集合,相当于表格
runoob

> db.runoob.find()    //查找
{ "_id" : ObjectId("5bdfa9de80d8af2cf6fbc2fb"), "x" : 10 }
{ "_id" : ObjectId("5bdfd97980d8af2cf6fbc2fc"), "name" : "rmk", "age" : 22 }
{ "_id" : ObjectId("5bdfda9c80d8af2cf6fbc2fe"), "b" : 15, "d" : 25 }

> db.runoob.insert({"str1":hello,"str2":world})        //新增错误
2018-11-05T14:03:41.024+0800 E QUERY    [js] ReferenceError: hello is not define
d :
@(shell):1:12
//hello没有加引号,只有数字可以不加引号,或者是变量,现在是定义字符串“hello”

> db.runoob.insert({"str1":"hello","str2":"world"})    //新增
WriteResult({ "nInserted" : 1 })

> db.runoob.find()    //查找
{ "_id" : ObjectId("5bdfa9de80d8af2cf6fbc2fb"), "x" : 10 }
{ "_id" : ObjectId("5bdfd97980d8af2cf6fbc2fc"), "name" : "rmk", "age" : 22 }
{ "_id" : ObjectId("5bdfda9c80d8af2cf6fbc2fe"), "b" : 15, "d" : 25 }
{ "_id" : ObjectId("5bdfdd7980d8af2cf6fbc2ff"), "str1" : "hello", "str2" : "worl
d" }

> db.runoob.find({"name":"rmk"})    //按条件查找
{ "_id" : ObjectId("5bdfd97980d8af2cf6fbc2fc"), "name" : "rmk", "age" : 22 }

> db.runoob.update({"str1":"hello"},{"str2":"China"})    //更新数据
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

> db.runoob.find()    //查找更新后的结果
{ "_id" : ObjectId("5bdfa9de80d8af2cf6fbc2fb"), "x" : 10 }
{ "_id" : ObjectId("5bdfd97980d8af2cf6fbc2fc"), "name" : "rmk", "age" : 22 }
{ "_id" : ObjectId("5bdfda9c80d8af2cf6fbc2fe"), "b" : 15, "d" : 25 }
{ "_id" : ObjectId("5bdfdd7980d8af2cf6fbc2ff"), "str2" : "China" }

> db.runoob.remove({"str2":"China"})    //按条件删除
WriteResult({ "nRemoved" : 1 })

> db.runoob.find()    //查找删除后的结果
{ "_id" : ObjectId("5bdfa9de80d8af2cf6fbc2fb"), "x" : 10 }
{ "_id" : ObjectId("5bdfd97980d8af2cf6fbc2fc"), "name" : "rmk", "age" : 22 }
{ "_id" : ObjectId("5bdfda9c80d8af2cf6fbc2fe"), "b" : 15, "d" : 25 }

六、高级应用

1. 条件查找

  • db.collection.find({ "key" : value })           查找key=value的数据
  • db.collection.find({ "key" : { $gt: value } })      key > value
  • db.collection.find({ "key" : { $lt: value } })      key < value
  • db.collection.find({ "key" : { $gte: value } })     key >= value
  • db.collection.find({ "key" : { $lte: value } })      key <= value
  • db.collection.find({ "key" : { $gt: value1 , $lt: value2 } })    value1 < key <value2
  • db.collection.find({ "key" : { $ne: value } })    key <> value
  • db.collection.find({ "key" : { $mod : [ 10 , 1 ] } })    取模运算,条件相当于key % 10 == 1 即key除以10余数为1的
  • db.collection.find({ "key" : { $nin: [ 1, 2, 3 ] } })    不属于,条件相当于key的值不属于[ 1, 2, 3 ]中任何一个
  • db.collection.find({ "key" : { $in: [ 1, 2, 3 ] } })    属于,条件相当于key等于[ 1, 2, 3 ]中任何一个
  • db.collection.find({ "key" : { $size: 1 } })    $size 数量、尺寸,条件相当于key的值的数量是1(key必须是数组,一个值的情况不能算是数量为1的数组)
  • db.collection.find({ "key" : { $exists : true|false } })    $exists 字段存在,true返回存在字段key的数据,false返回不存在字度key的数据
  • db.collection.find({ "key": /^val.*val$/i })    正则,类似like;“i”忽略大小写,“m”支持多行
  • db.collection.find({ $or : [{a : 1}, {b : 2} ] })    $or或 (注意:MongoDB 1.5.3后版本可用),符合条件a=1的或者符合条件b=2的数据都会查询出来
  • db.collection.find({ "key": value , $or : [{ a : 1 } , { b : 2 }] })    符合条件key=value ,同时符合其他两个条件中任意一个的数据
  • db.collection.find({ "key.subkey" :value })    内嵌对象中的值匹配,注意:"key.subkey"必须加引号
  • db.collection.find({ "key": { $not : /^val.*val$/i } })    这是一个与其他查询条件组合使用的操作符,不会单独使用。上述查询条件得到的结果集加上$not之后就能获得相反的集合。

2. 排序

  • db.collection.find().sort({ "key1" : -1 ,"key2" : 1 })    这里的1代表升序,-1代表降序

3. 其他

  • db.collection.find().limit(5)    控制返回结果数量,如果参数是0,则当作没有约束,limit()将不起作用
  • db.collection.find().skip(5)    控制返回结果跳过多少数量,如果参数是0,则当作没有约束,skip()将不起作用,或者说跳过了0条
  • db.collection.find().skip(5).limit(5)    可用来做分页,跳过5条数据再取5条数据
  • db.collection.find().count(true)    count()返回结果集的条数
  • db.collection.find().skip(5).limit(5).count(true)    在加入skip()和limit()这两个操作时,要获得实际返回的结果数,需要一个参数true,否则返回的是符合查询条件的结果总数

猜你喜欢

转载自blog.csdn.net/qq_37811638/article/details/83744755