MongoDB是一个著名的NoSQL数据库,顾名思义就是不使用SQL的数据库,目前在不少场景都有使用。若是你不喜欢使用笨拙的各类SQL数据库,能够尝试使用一下MongoDB,会有不同的感觉。本文就是一篇简单的Windows下的安装和使用教程。html
首先,先到MongoDB官网下载页下载社区版的服务器,因为这里是Windows系统,因此固然下载Windows版本的。注意咱们要下载的是社区版,而不是导航条第一个的Atlas。如你所见,MongoDB官网是一个商业化的网站,Atlas正是它提供的一个商业版服务,可让咱们链接到他们的服务器。python
具体版本默认第一个就能够了,功能最全,带有SSL支持。注意三个版本都是64位的,因此32位的操做系统没法运行。下载完成以后安装便可,大约150M左右的安装包,很快就能够安装完毕。git
对于我来讲,我将其安装到了D:\Program Files\MongoDB
。等到安装完成,打开D:\Program Files\MongoDB\Server\3.4\bin
就会发现MongoDB的一系列程序,主要用到的就是mongo.exe
(客户端)和mongod.exe
(服务端)。为了使用方便,最好把这个路径添加到环境变量中,之后就能够直接在终端中使用这些命令了。首先要作的事情固然是启动服务端。在终端直接执行mongod
命令便可。github
mongod
而后你就会发现如图所示的错误。mongodb
固然具体错误图里面说的很清楚了,没有数据文件夹。默认Windows版本,会在你安装盘符下寻找data/db
文件夹做为数据文件夹,个人D盘上天然没有,因此会出现错误。解决办法很简单,在命令上添加--dbpath
参数便可。shell
mongod --dbpath d:\test\mongodb\data
固然还可使用配置文件。配置文件名字能够随便起,可是格式必须是YAML格式的。例如我但愿让可执行文件目录下的data
文件夹做为数据文件夹,而且对于每一个单独的数据库都有本身的目录,就能够这么配置(别忘了建立对应文件夹)。关于配置文件的详细文档能够参考官方Configuration File Options。数据库
storage: dbPath: data directoryPerDB: true
配置完成后,使用-f
或者--config
参数来指定配置文件。编程
mongod --config /etc/mongod.conf mongod -f /etc/mongod.conf
这样,MongoDB服务器就能够成功启动了。windows
每次启动都要输入命令很麻烦,MongoDB提供了注册为Windows服务的功能。原本一开始我是用的winsw来注册服务的,而后发现MongoDB官方就带了这个功能。因此来介绍一下。api
其实很简单,打开上面介绍的配置文件,而后添加下面一节内容,具体名称本身修改。这里用户名和密码不是必须的。这里日志设置是必须的,否则会提示没法安装Windows服务。
storage: dbPath: 'D:\Program Files\MongoDB\Server\3.4\data' directoryPerDB: true processManagement: windowsService: serviceName: MongoDB displayName: MongoDB description: MongoDB serviceUser: <string> servicePassword: <string> systemLog: destination: file path: 'D:\Program Files\MongoDB\Server\3.4\mongod.log'
而后在运行服务端的时候添加--install
参数,并且这里的配置文件路径必须使用绝对路径。别忘了使用管理员权限的cmd或者Powershell来运行。
mongod -f 'D:\Program Files\MongoDB\Server\3.4\config.yaml' --install
安装以后的服务默认是开机自启的,不过没有启动,因此还须要咱们手动启动。手动在服务中启动,或者在管理员权限的Powershell中执行下面的命令。
Start-Service MongoDB
若是没有修改端口号等配置的话,能够直接链接。
PS C:\WINDOWS\system32> mongo MongoDB shell version v3.4.10 connecting to: mongodb://127.0.0.1:27017 MongoDB server version: 3.4.10 Server has startup warnings: 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-11-20T04:48:38.134+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-11-20T04:48:38.135+0800 I CONTROL [initandlisten] >
因为我正好有一个Dedicenter的服务器,因此顺便来试试Linux下安装。Linux下安装其实也很简单,使用对应的包管理器能够比较方便的安装和启动。例如个人服务器是CentOS 7的系统,因此使用yum包管理器来安装软件。下面的命令同时安装了客户端和服务器端。
$ sudo yum install mongodb-server mongodb
固然我安装完了以后发现了一个问题,那就是CentOS自带的MongoDB版本比较低,如今的版本是3.4,而自带的版本是2.6.因此仍是须要本身安装最新版的。具体方法须要搜索。对于CentOS 来讲,首先须要建立社区源的文件/etc/yum.repos.d/mongodb-org-3.4.repo
,内容以下。
[mongodb-org-3.4] name=MongoDB Repository baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/ gpgcheck=1 enabled=1 gpgkey=https://www.mongodb.org/static/pgp/server-3.4.asc
而后安装mongodb-org
软件包,会包括客户端、服务端、shell工具等四个软件包。
$ sudo yum install mongodb-org
若是对应的系统还启用了SELinux,那么还须要作一些额外工做,这些工做就须要查看官方文档Install MongoDB Community Edition on Red Hat Enterprise or CentOS Linux了。个人服务器没有SELinux功能,因此不须要这额外的步骤了。
Linux下,MongoDB的数据文件在/var/lib/mongo
下,日志文件在/var/log/mongodb
下,这些都不须要更改。若是有须要的话,别忘了设置对应的权限。
首先须要编辑一下配置文件/etc/mongod.conf
。先来设置一下监听IP,因为这是个人服务器,我但愿能够在外网访问数据库,因此把IP这一行注释掉,或者修改为0.0.0.0
。其他配置按需求更改。
net: port: 27017 # bindIp: 127.0.0.1 # Listen to local interface only, comment to listen on all interfaces.
而后启动服务端。
sudo systemctl enable mongod sudo systemctl start mongod
而后输入mongo
命令来链接。若是是链接其余主机的服务器,须要使用额外的参数。
mongo -host XXX.XX.XXX.XXX -port 27017
在前面咱们一直都没有设置用户名和密码,这可能致使安全问题,登陆客户端的时候也同时给了警告。因此咱们第一件事情就是设置用户名和密码。这部分能够参考官方文档Enable Auth。
首先先以默认方式登陆,而后切换到管理员数据库并新建管理员用户。
use admin db.createUser( { user: "admin", pwd: "12345678", roles: [ { role: "userAdminAnyDatabase", db: "admin" } ] } )
而后在重启服务端的时候同时添加--auth
参数,或者在配置文件中设置。
security: authorization: enabled
服务器启用验证以后,客户端在登陆的时候也须要验证。能够在启动的时候经过参数来验证。
mongo --port 27017 -u "myUserAdmin" -p "abc123" --authenticationDatabase "admin"
或者先以无权限方式登陆,而后在进行验证。
use admin db.auth("myUserAdmin", "abc123" )
固然,实际状况中咱们确定不会使用管理员去登陆通常数据库(实际上MongoDB也不容许,管理员只有建立用户和角色的权限),因此还须要建立一个普通用户进行访问。在你使用的数据库中建立一个用户,并赋予合适的权限便可。登陆方式基本同上,只不过验证数据库改一下就行。
use test db.createUser( { user: "myTester", pwd: "xyz123", roles: [ { role: "readWrite", db: "test" }, { role: "read", db: "reporting" } ] } )
固然,若是是开发和测试,创建一个万能的管理员用户更加省时。
use admin db.createUser( { user: "superuser", pwd: "12345678", roles: [ "root" ] } )
先来讲说MongoDB的增删查改。这一部分的官方文档是MongoDB CRUD Operations,这一块的文档作的很是好,还配有Web控制台能够链接到它的示例数据库,因此咱们能够一边阅读文档一边测试命令,很是方便。
首先先选定一个数据库,若是该数据库不存在,会建立这个数据库。
use hello
先来看看插入操做,主要有如下两个方法,分别用于一次性插入一个或多个数据。若是集合不存在,会首先建立这个集合。
下面是一个简单的例子。插入的数据相似JSON格式。
> db.user.insertOne({id:1,name:'yitian',age:24}) { "acknowledged" : true, "insertedId" : ObjectId("5a12bc37f8fe60078d1a24fe") } > db.user.insertOne({id:2,name:'zhang3',age:25}) { "acknowledged" : true, "insertedId" : ObjectId("5a12bc93f8fe60078d1a24ff") }
若是要使用insertMany
插入多个数据,须要使用[]
来传递一个数组。这是官方文档的例子。
db.inventory.insertMany([ { item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } }, { item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } }, { item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } } ])
首先准备一些示例数据。
db.inventory.insertMany([ { item: "journal", qty: 25, size: { h: 14, w: 21, uom: "cm" }, status: "A" }, { item: "notebook", qty: 50, size: { h: 8.5, w: 11, uom: "in" }, status: "A" }, { item: "paper", qty: 100, size: { h: 8.5, w: 11, uom: "in" }, status: "D" }, { item: "planner", qty: 75, size: { h: 22.85, w: 30, uom: "cm" }, status: "D" }, { item: "postcard", qty: 45, size: { h: 10, w: 15.25, uom: "cm" }, status: "A" } ]);
若是要查询全部数据,直接传递一个空对象。
db.inventory.find( {} )
若是用具体的条件来查询,直接传递具体的键值对{ <field1>: <value1>, ... }
便可。
db.inventory.find( { status: "D" } )
若是使用条件查询的话,须要传递查询属性、运算符以及查询条件{ <field1>: { <operator1>: <value1> }, ... }
。
# 查询stauts是A或D的 db.inventory.find( { status: { $in: [ "A", "D" ] } } ) # 查询status是A,且qty小于30的 db.inventory.find( { status: "A", qty: { $lt: 30 } } ) # 查询status是A或qyt小于30的 db.inventory.find( { $or: [ { status: "A" }, { qty: { $lt: 30 } } ] } ) # 更复杂的查询 db.inventory.find( { status: "A", $or: [ { qty: { $lt: 30 } }, { item: /^p/ } ] } )
更新操做主要使用如下三个函数,用于更新一个、多个或者替换数据。<filter>
就是切面介绍的查询条件,其他的将在下面介绍。
db.collection.updateOne(<filter>, <update>, <options>)
db.collection.updateMany(<filter>, <update>, <options>)
db.collection.replaceOne(<filter>, <replacement>, <options>)
先来看看更新一个数据,须要用到$set
操做符,用来设置新属性。$currentDate
操做符用于设置最后修改时间,若是lastModified
属性不存在,就会添加这个属性并设置为当前时间。
db.inventory.updateOne( { item: "paper" }, { $set: { "size.uom": "cm", status: "P" }, $currentDate: { lastModified: true } } )
相似的,是更新多条数据。
db.inventory.updateMany( { "qty": { $lt: 50 } }, { $set: { "size.uom": "in", status: "P" }, $currentDate: { lastModified: true } } )
最后是替换数据。
db.inventory.replaceOne( { item: "paper" }, { item: "paper", instock: [ { warehouse: "A", qty: 60 }, { warehouse: "B", qty: 40 } ] } )
最后来讲说<option>
。目前这个选项只有一个upsert : true
,若是设置为true,那么若是没有查询到相应的数据,会将更新的数据做为新数据插入到数据库中。
删除数据相对来讲很简单,语法和前面基本相似。因此直接来看李子坝。
首先是删除全部数据。
db.inventory.deleteMany({})
删除符合条件的全部数据。
db.inventory.deleteMany({ status : "A" })
删除单条数据。
db.inventory.deleteOne( { status: "D" } )
官方文档MongoDB CRUD Operations作的很不错的一点就是包含了多种语言的范例,基本上支持了如今全部的主流语言。
官方推荐使用PyMongo库来操做MongoDB。首先须要安装。文档能够参考PyMongo 3.5.1 Documentation。
pip install PyMongo
简单的增删查改例子以下。
from pymongo import MongoClient from pprint import pprint # 链接数据库 client = MongoClient('localhost', 27017) # 选择数据库 db = client['hello'] # 获取集合 user = db.user # 插入数据 user.insert_one({"_id": 1, "name": "yitian", "age": 24}) user.insert_one({"_id": 2, "name": "zhang3", "age": 25}) user.insert_one({"_id": 3, "name": "li4", "age": 26}) # 更新数据 user.update_one({"_id": 1}, {"$set": {"name": "易天"}}) user.update_many({}, {"$inc": {"age": 1}}) # 查询数据 yitian = user.find_one({"name": "yitian"}) yitian = user.find_one({"_id": 1}) pprint(yitian) print("------全部数据--------") for u in user.find(): pprint(u) print("------年龄大于25的--------") for u in user.find({"age": {"$gt": 25}}): pprint(u) # 删除全部数据 user.remove({})
C#和Kotlin是我最喜欢的两门语言。因此顺便来看看如何用C#访问MongoDB。对应的官网文档是MongoDB .NET Driver。
首先须要安装NuGet包,若是使用Visual Studio的话很是简单,右键点击项目,选择管理安装的NuGet包,而后搜索并安装MongoDB便可。下面是个简单的例子。
public static void Sample() { var client = new MongoClient("mongodb://localhost:27017"); var db = client.GetDatabase("hello"); var user = db.GetCollection<BsonDocument>("user"); user.InsertOne(new BsonDocument { { "name", "yitian" }, { "_id", 1 }, { "age", 25 } }); user.InsertOne(new BsonDocument { { "name", "li4" }, { "_id", 3 }, { "age", 24 } }); Console.WriteLine("查询单条数据"); var filter = Builders<BsonDocument>.Filter.Eq("_id", 1); Console.WriteLine( user.Find(filter).First() ); Console.WriteLine("更新用户姓名"); user.FindOneAndUpdate(filter, Builders<BsonDocument>.Update.Set("name", "易天")); Console.WriteLine("条件查询大于25的"); filter = Builders<BsonDocument>.Filter.Gte("age", 25); user.Find(filter).ToList().ForEach(e => Console.WriteLine(e)); Console.WriteLine("全部数据"); user.Find(new BsonDocument()).ToList().ForEach(e => Console.WriteLine(e)); user.DeleteMany(new BsonDocument()); }
最后来介绍一下几个图形客户端,方便咱们对数据进行可视化处理。
第一个就是MongoDB官方的图形客户端Compass,用起来还能够。
第二个叫MongoBooster,是一个MongoDB的IDE,智能提示和补全比较方便,同时支持流式API方便查询。
第三个是Robo 3T,原名叫作Robomongo,是一个轻量级图形客户端。若是但愿更多功能,还能够下载使用Studio 3T,一个智能IDE。
最后说一下我对MongoDB的感觉。它是一个比较轻量级的NoSQL数据库,存储序列化的数据很合适,可是多表查询功能比较弱,要想作到SQL数据库那种复杂的多表查询比较困难。可是若是是我的小项目的话,仍是很是推荐使用的,用起来心理做用上比SQL数据库的逼格仍是要高一些的。