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:MongDBdatalogmongod.log
storage:
dbPath: D:MongDBdatadb

其中path和dbpath分别为第二步新建的log文件夹和db文件夹的路径

运行 MongoDB 服务

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

配置mongoDB服务(以后可以在服务那里开启mongod服务或者设置为开机启动,不需要手动运行mongod.exe)

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

D:MongDBinmongod.exe --config D:MongDBmongod.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"),
          “teacher":"MrWang"
          "student" : {
                       "grades" : {
                       "math" : 90,
                       "English" : 80,
                       "Chinese" : 70,
                 }
              }
        }
中的math的值改为80,该如何做呢
利用符号"."来分级
collection.update({"_id":ObjectId("58121b864c26bf241b000056")},{"$set":{"student.grades.math":80}})
原文地址:https://www.cnblogs.com/woaixuexi9999/p/9260814.html