安装和使用MongoDB

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

注册为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]
>

Linux下安装和配置

安装

因为我正好有一个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

官方文档MongoDB CRUD Operations作的很不错的一点就是包含了多种语言的范例,基本上支持了如今全部的主流语言。

使用Python

官方推荐使用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

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());
        }

图形客户端

最后来介绍一下几个图形客户端,方便咱们对数据进行可视化处理。

Compass

第一个就是MongoDB官方的图形客户端Compass,用起来还能够。

MongoBooster

第二个叫MongoBooster,是一个MongoDB的IDE,智能提示和补全比较方便,同时支持流式API方便查询。

Robo 3T

第三个是Robo 3T,原名叫作Robomongo,是一个轻量级图形客户端。若是但愿更多功能,还能够下载使用Studio 3T,一个智能IDE。

最后说一下我对MongoDB的感觉。它是一个比较轻量级的NoSQL数据库,存储序列化的数据很合适,可是多表查询功能比较弱,要想作到SQL数据库那种复杂的多表查询比较困难。可是若是是我的小项目的话,仍是很是推荐使用的,用起来心理做用上比SQL数据库的逼格仍是要高一些的。

相关文章
相关标签/搜索