MongoDB数据库
Posted purplelavender
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MongoDB数据库相关的知识,希望对你有一定的参考价值。
MongoDB介绍
什么是NoSQL?
NoSQL,指的是非关系型的数据库。NoSQL有时也称作Not Only SQL的缩写,是对不同于传统的关系型数据库的数据库管理系统的统称。
NoSQL用于超大规模数据的存储。(例如谷歌或Facebook每天为他们的用户收集万亿比特的数据)。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
为什么使用NoSQL ?
今天我们可以通过第三方平台(如:Google,Facebook等)可以很容易的访问和抓取数据。用户的个人信息,社交网络,地理位置,用户生成的数据和用户操作日志已经成倍的增加。我们如果要对这些用户数据进行挖掘,那SQL数据库已经不适合这些应用了, NoSQL数据库的发展也却能很好的处理这些大的数据。
NoSQL的优点/缺点
优点:
- - 高可扩展性
- - 分布式计算
- - 低成本
- - 架构的灵活性,半结构化数据
- - 没有复杂的关系
缺点:
- - 没有标准化
- - 有限的查询功能(到目前为止)
- - 最终一致是不直观的程序
什么是MongoDB ?
MongoDB是一款NoSQL数据库
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安装简单。
在MongoDB中,一行纪录就是一个文档,它是一个由键值对构成的数据结构,MongoDB文档与JSON对象类似。键的值可以包含其他的文档,数组,文档数组。
{ "_id" : ObjectId("5a55c9857c1ccc05bc71e9b0"), "aid" : 2, "view" : "--", "danmaku" : 3564, "reply" : 3564, "favorite" : 2763, "coin" : 924, "share" : 1511, "now_rank" : 0, "his_rank" : 0, "no_reprint" : 0, "copyright" : 2 }
集合
MongoDB在集合中存储文档。集合类似于关系数据库中的表。然而,与表不同的是集合不要求它里面的文档具有相同的结构。在MongoDB中,存储在集合中的文档必然有一个唯一的_id字段作为主键。
Windows 平台安装 MongoDB
MongoDB 下载
MongoDB 提供了可用于 32 位和 64 位系统的预编译二进制包,你可以从MongoDB官网下载安装,MongoDB 预编译二进制包下载地址:https://www.mongodb.com/download-center#community
根据你的系统下载 32 位或 64 位的 .msi 文件,下载后双击该文件,按操作提示安装即可。
安装过程中,你可以通过点击 "Custom(自定义)" 按钮来设置你的安装目录
安装完之后
创建数据目录
MongoDB将数据目录存储在 db 目录下。但是这个数据目录不会主动创建,我们在安装完成后需要创建它。请注意,数据目录应该放在根目录下((如: C:\\ 或者 D:\\ 等 )。
比如 我新建的目录为 D:/data/db 和 D:/data/log/mongod.log
接下来新建mongod.cfg放到MongDB根目录下,mongod.cfg内容为
systemLog: destination: file path: D:\\MongDB\\data\\log\\mongod.log storage: dbPath: D:\\MongDB\\data\\db
其中path和dbpath分别为第二步新建的log文件夹和db文件夹的路径
运行 MongoDB 服务
从命令提示符下运行 MongoDB 服务器,你必须从 MongoDB 目录的 bin 目录中执行 mongod.exe 文件。
配置mongoDB服务(以后可以在服务那里开启mongod服务或者设置为开机启动,不需要手动运行mongod.exe)
通过执行mongod.exe,使用--install选项来安装服务,使用--config选项来指定之前创建的配置文件。
命令:
D:\\MongDB\\bin\\mongod.exe --config D:\\MongDB\\mongod.cfg --install
然后再启动服务
net start MongDB
另外,关闭MongoDB服务
net stop MongoDB
移除MongoDB 服务
sc delete MongDB
MongoDB 后台管理 Shell
如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo.exe文件,MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
> mongo MongoDB shell version: 3.0.6 connecting to: test ……
Linux平台安装MongoDB
MongoDB 提供了 linux 各发行版本 64 位的安装包,你可以在官网下载安装包。
下载地址:https://www.mongodb.com/download-center#community
下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装) 。
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下载 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解压 mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 将解压包拷贝到指定目录
MongoDB 的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中:
export PATH=<mongodb-install-directory>/bin:$PATH
<mongodb-install-directory> 为你 MongoDB 的安装路径。如本文的 /usr/local/mongodb 。
创建数据库目录
MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。
以下实例中我们将data目录创建于根目录下(/)。
注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。
mkdir -p /data/db
命令行中运行 MongoDB 服务
你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务。
注意:如果你的数据库目录不是/data/db,可以通过 --dbpath 来指定。
$ ./mongod 2015-09-25T16:39:50.549+0800 I JOURNAL [initandlisten] journal dir=/data/db/journal 2015-09-25T16:39:50.550+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2015-09-25T16:39:50.869+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.16 2015-09-25T16:39:51.206+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.52 2015-09-25T16:39:52.775+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 7.7
MongoDB后台管理 Shell
如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。
MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell. ……
数据库操作
show dbs 查看当前所有的数据库
use dbname 进入dbname数据库,没有就创建
db.test.insert({\'name\':\'jack\'}) 创建test集合,并往其中插入数据(数据一般是字典类型){\'name\':\'jack\'}
操作符
1、比较操作符
$gt 匹配大于(>)指定值的文档
$gte 匹配大于等于指定值的文档
$lt 匹配小于指定值的文档
$lte 小于等于
$ne 不等于
$in 匹配数组中的任意值
例:
查找score大于等于80的数据
db.find({\'score\':{$gte:80}})
查找students是55,54,56中任一个的数据
db.test.find({\'students\':{$in:[55,54,56]}})
2、逻辑操作符
$or 或条件查询
查询students大于等于55或者title等于python_mongodb教学的文档
db.test.find({$or:[{\'students\':{$gte:55}},{\'title\':\'python_MongoDB教学\'}]})
$and 与条件查询
$not 查询和表达式不匹配的文档
$nor 查询与任一表达式都不匹配的文档
db.test.find({$nor:[{\'students\':{$gte:57}},{\'title\':\'python_MongoDB教学\'}]})
3、更新操作符
$inc 将文档中的某个field对应的value自增/减某个数字amount
db.test.update({\'class\':\'python\'},{$inc:{\'students\':1}})
$mul 将文档中的某个field对应的value做乘法操作,同上。
db.test.update({\'score\':60},{$mul:{\'students\':0.8}})
$rename 重名名文档中指定的字段名字
$set 更新文档中的某一个字段,而不是全部替换
db.test.update({\'students\':116},{$set:{\'students\':56}})
加上 {multi:true} 就会修改所有匹配条件的文档
增删改查
在MongoDB中,可以使用insert()方法和save方法插入一个文档到MongoDB集合中,如果此集合不存在,MongoDB会自动为你创建。先用命令行连接到MongoDB,再进入tz_mongo
数据库。use tz_mongo
然后插入一个文档到test集合,如果test集合不存在,这个操作会自己创建test集合。例如:
> db.test.insert({\'class\':\'python\',\'students\':50}) > db.test.save({\'class\':\'python\',\'students\':50}) > db.test.find() { "_id" : ObjectId("5a586e8522dbc47846dd8e1f"), "class" : "python", "students" : 50 } { "_id" : ObjectId("5a586eae22dbc47846dd8e20"), "class" : "python", "students" : 50 }
在插入的文档中,如果不指定_id参数,那么 MongoDB 会为此文档分配一个唯一的ObjectId。_id为集合中的每个文档唯一的12个字节的十六进制数。
修改数据
MongoDB 使用 update() 和 save() 方法来更新集合中的文档。接下来让我们详细来看下两个函数的应用及其区别。update() 方法。
update方法
update方法用于更新已经存在的文档。
我们先在test里面插入条数据,然后再进行修改。 > db.test.insert({\'title\':\'MongoDB教学\'}) WriteResult({ "nInserted" : 1 }) > db.test.update({\'title\':\'MongoDB教学\'},{$set:{\'title\':\'tz_MongoDB教学\'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
然后再查看数据发现数据已经被修改。这里set的作用是指更新文档当中的某一个字段,如果不使用set,文档会被直接替换。update方法默认只更新一个文档.如果需要更新多个文档,需要指定multi参数
save方法
save() 方法通过传入的文档来替换已有文档。
>db.test.save({\'_id\':ObjectId("5a586e8522dbc47846dd8e1f"),\'class\':\'java\',\'students\':56})
查询数据
mongo查询数据使用的主要方法就是find。find方法以分结构化的方式来显示所有文档。find方法可以传入查询条件来进行数据查询。也可以不传。
> db.test.find() 默认返回20条数据 > db.test.findOne() 返回一条数据 > db.test.find().limit(num) 返回num条数据,不超过20条 > db.test.find({\'class\':\'爬虫1班\'}) 通过给定的字段查询 > db.test.find({\'students\':{$gte:58}}) 查询students大于等于58的数据 > db.test.find({$or:[{\'students\':58},{\'students\':55}]}) or操作符
删除数据
使用remove()方法从集合中删除文档。这个方法需要一个条件文档用来决定哪些文档将被删除。
> db.test.remove({\'class\':\'爬虫1班\'}) 删除指定条件匹配的所有文件。 > db.test.remove({\'class\':\'爬虫1班\'},{justOne:true}) 删除匹配条件的一条数据 > db.test.remove({}) 删除当前文档 > db.test.drop() 删除集合
删除操作也会返回一个WriteResult对象,他包含了操作的状态信息,nremoved字段值,表示被删除的字段数量。
总结:
db.test.insert(data) #插入数据 db.test.save(data) #保存数据,如果不存在就插入,若存在就修改(必须id也一样才是存在) db.test.remove(conditions) #删除指定条件匹配的所有数据 db.test.remove(conditions,{justone:true}) #删除匹配条件的一条数据 db.test.remove({}) #删除整个文档 db.test.drop() #删除这个集合 db.test.update({\'name\':\'jack\'},{$set:{\'score\':90}}) #把名字为jack的人的得分改为90 db.test.update(conditions,{$set:newdata},{multi:true}) #update只修改一条,加上 {multi:true} 就会修改所有匹配条件的文档 db.test.findone() db.test.find(conditions) #查找匹配条件的文档,默认最多返回20条 db.test.find(conditions).limit(num) #查找匹配条件的文档,最多返回num条,num不超过20
python操作mongoDB数据库
使用pymongo这个第三方库
安装:
pip install pymongo
使用
""" 使用pymongo库操作MongoDB数据库 """ import pymongo # 1.连接数据库服务器,获取客户端对象 mongo_client=pymongo.MongoClient(\'localhost\',27017) # 2.获取数据库对象 db=mongo_client.myDB # db=mongo_client[\'myDB\'] # 3.获取集合对象 my_collection=db.myCollection # my_collection=db[\'myCollection\'] print("——"*50) # 插入文档 tom={\'name\':\'Tom\',\'age\':18,\'sex\':\'男\',\'hobbies\':[\'吃饭\',\'睡觉\',\'打豆豆\']} alice={\'name\':\'Alice\',\'age\':19,\'sex\':\'女\',\'hobbies\':[\'读书\',\'跑步\',\'弹吉他\']} tom_id=my_collection.insert(tom) alice_id=my_collection.insert(alice) print(tom_id) print(alice_id) print("——"*50) # 查询文档 cursor=my_collection.find() print(cursor.count()) # 获取文档个数 for item in cursor: print(item) print("——"*50) # 修改文档 my_collection.update({\'name\':\'Tom\'},{\'$set\':{\'hobbies\':[\'向Alice学习读书\',\'跟Alice一起跑步\',\'向Alice学习弹吉他\']}}) for item in my_collection.find(): print(item) print("——"*50) # 删除文档 # my_collection.remove({\'name\':\'Tom\'},{\'justOne\':0}) my_collection.remove() for item in my_collection.find(): print(item)
注意 mongodb里的数据都是字典格式的。
补充
多条插入:
1 >>> new_posts = [{"author": "Mike", 2 ... "text": "Another post!", 3 ... "tags": ["bulk", "insert"], 4 ... "date": datetime.datetime(2009, 11, 12, 11, 14)}, 5 ... {"author": "Eliot", 6 ... "title": "MongoDB is fun", 7 ... "text": "and pretty easy too!", 8 ... "date": datetime.datetime(2009, 11, 10, 10, 45)}] 9 >>> result = posts.insert_many(new_posts) 10 >>> result.inserted_ids 11 [ObjectId(\'...\'), ObjectId(\'...\')]
获取集合的数据条数:
>>> collection.count()
或者说满足某种查找条件的数据条数:
>>> collection.find({"author": "Mike"}).count()
查询结果排序
>>> db.Account.find().sort("UserName") #默认为升序 >>> db.Account.find().sort("UserName",pymongo.ASCENDING) #升序 >>> db.Account.find().sort("UserName",pymongo.DESCENDING) #降序
查询结果多列排序
>>> db.Account.find().sort([("UserName",pymongo.ASCENDING),("Email",pymongo.DESCENDING)])
修改多级字段数据
假如要把这样一条数据
"_id" : ObjectId("58121b864c26bf241b000056"),
"student" : {
"grades" : {
"math" : 90,
"English" : 80,
"Chinese" : 70,
}
}
}
collection.update({"_id":ObjectId("58121b864c26bf241b000056")},{"$set":{"student.grades.math":80}})
以上是关于MongoDB数据库的主要内容,如果未能解决你的问题,请参考以下文章
ios - Heroku 和 MongoDb 上的自定义解析服务器错误 3080:JSON 文本没有以数组或对象开头,并且允许未设置片段的选项