下一篇:MongoDB(二):概念解析之了解MongoDB
本博客通过六大方面介绍如下内容:
其中二、Windows 平台安装MongoDB,三、Python中安装pymongo,四、安装mongoengine,
这三步用于Python中使用MongoDB的操作。可以针对Python学习。
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
MongoDB是非关系型数据库(NoSQL)。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
RDBMS (关系型数据库管理系统)
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL (非关系型数据库管理系统)
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
事务在英文中是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) 持久性
持久性是指一旦事务提交后,它所做的修改将会永久的保存在数据库上,即使出现宕机也不会丢失。
优点:
缺点:
你可以在mongodb官网下载该安装包,地址为:https://www.mongodb.com/download-center#community。MonggoDB支持以下平台:
MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。
在本教程中,我已经在D盘安装了 mongodb,现在让我们创建一个 data 的目录,然后在 data 目录里创建 db 目录。
为了从命令提示符下运行 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
……
我们可以在命令窗口中运行 mongo.exe 命令即可连接上 MongoDB,执行如下命令:
D:\Program Files (x86)\MongoDB\bin\mongo.exe //即在bin目录下打开命令行 运行mongo.exe
管理员模式打开命令行窗口
创建目录,执行下面的语句来创建数据库和日志文件的目录
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
通过执行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
如果你需要进入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的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"])
...
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()
> 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 }
下一篇:MongoDB(二):概念解析之了解MongoDB