MongoDb 入门教程

MongoDb 入门教程

 

MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。css

它是可扩展的高性能数据存储解决方案,常常被用于非关系型数据的存储,能存储海量的数据。html

常见的非关系型数据库还有:Redis,但 MongoDb 比 redis 更具备数据库的特性。python

MongoDb的基本数据结构

与 MySQL 等关系型数据库同样,MongoDb 也有相似的概念,可是其称呼不一样。下表列出了 MongoDb 的基本数据结构以及与 MySQL 的对比。git

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins   表链接,MongoDb不支持
primary key primary key 主键,MongoDb自动将_id字段设置为主键

能够看到 MongoDb 与 SQL 的数据库概念都是一致的,而 MongoDb 中数据库表(Table)则称之为集合(Collection),行(Row)则称为文档(Document),列(Column)则称为字段(Field)。github

安装MongoDb服务器

MongoDB 提供了 OSX 平台上 64 位的安装包,你能够在官网下载安装包。redis

下载地址:MongoDb Download Center | MongoDBsql

下载后解压文件并作好PATH路径配置:mongodb

# 解压文件 tar -zxvf mongodb-osx-x86_64-3.4.7.tgz # 配置${mongodb_home}/bin到PATH路径 export PATH=<mongodb-install-directory>/bin:$PATH

建立数据库存储目录:shell

mkdir -p /data/db

建立完目录以后,直接运行mongod命令便可启动MongoDb服务器。mongod命令默认使用/data/db为 MongoDb 数据库的数据文件目录。若是须要改变数据文件存储目录,须要指定--dbpath参数,例如:数据库

mongod --dbpath /Users/yurongchan/mongodb_data_file

相似的启动配置参数还有:

参数 描述
--bind_ip 绑定服务IP,若绑定127.0.0.1,则只能本机访问,不指定默认本地全部IP
--logpath 定MongoDB日志文件,注意是指定文件不是目录
--logappend 使用追加的方式写日志
--dbpath 指定数据库路径
--port 指定服务端口号,默认端口27017
--serviceName 指定服务名称
--serviceDisplayName 指定服务名称,有多个mongodb服务时执行。
--install 指定做为一个Windows服务安装。

运行mongod命令后控制台输出一系列初始化信息,包括使用的数据库文件存储目录等。若是没有什么异常信息,那就说明 MongoDb 服务器启动成功。

2017-08-27T15:23:39.680+0800 I CONTROL [initandlisten] MongoDB starting : pid=27207 port=27017 dbpath=/data/db 64-bit host=YuRongChandeMacBook-Pro.local 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] db version v3.4.7 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] git version: cf38c1b8a0a8dca4a11737581beafef4fe120bcd 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] allocator: system 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] modules: none 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] build environment: 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] distarch: x86_64 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] target_arch: x86_64 2017-08-27T15:23:39.681+0800 I CONTROL [initandlisten] options: {} 2017-08-27T15:23:39.682+0800 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=3584M,session_max=20000,eviction=(threads_min=4,threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0),

若是你的操做系统是Windows系统,你能够经过查阅这里获取安装的详细方法。

链接MongoDb服务器

服务器启动以后,咱们启动一个终端链接到 MongoDb 服务器,这样咱们就能够运行进行数据库CURD操做。链接MongoDb服务器命令的语法以下:

mongo server_ip:port/dbname -u user -p password

咱们这里直接链接本地服务器,所以直接运行mongo命令便可。此时控制台会打印出链接的 MongoDb 服务器地址以及端口等信息。

YuRongChandeMacBook-Pro:~ yurongchan$ mongo
MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help". For more comprehensive documentation, see http://docs.mongodb.org/ Questions? Try the support group http://groups.google.com/group/mongodb-user Server has startup warnings: 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: You are running this process as the root user, which is not recommended. 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] 2017-08-27T15:23:40.570+0800 I CONTROL [initandlisten] ** WARNING: soft rlimits too low. Number of files is 256, should be at least 1000

而 MongoDb 服务器控制台也会输出相关信息,提示有客户端链接到本服务器上。

2017-09-03T15:05:52.799+0800 I NETWORK [thread1] connection accepted from 127.0.0.1:55283 #1 (1 connection now open) 2017-09-03T15:05:52.804+0800 I NETWORK [conn1] received client metadata from 127.0.0.1:55283 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "3.4.7" }, os: { type: "Darwin", name: "Mac OS X", architecture: "x86_64", version: "14.1.0" } }

MongoDb建立数据库

MongoDb 建立和切换数据库的语法格式为:

use database_name

若是数据库不存在,则建立数据库,不然切换到指定数据库。

> use chenyurong switched to db chenyurong > db chenyurong > show dbs admin 0.000GB local 0.000GB

上面建立了名为chenyurong的数据库,可是咱们使用show dbs命令时并无看到该数据库存在,这是由于该数据库中尚未数据。要显示它,咱们须要向 chenyurong 数据库插入一些数据。关于插入数据操做,将在下面说起。

MongoDb建立表

MongoDb 中并无直接建立表的命令,表的数据结构在你往表插入数据时肯定。所以在 MongoDb 中,你建立完数据库以后就能够直接往表中插入数据,表名在插入数据时指定。

MongoDb插入数据

MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法以下:

db.collection.insert(document)

下面咱们向user表插入一条数据:

> db.user.insert({
... "name": "chenyurong", ... "age": 25, ... "addr": "ShenZhen" ... }) WriteResult({ "nInserted" : 1 }) > db.user.find() { "_id" : ObjectId("59a2782f6eb4c099dbb718a1"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" } > show dbs admin 0.000GB chenyurong 0.000GB local 0.000GB

能够看到咱们成功向user表插入了一条数据,此时咱们使用show dbs也能看到对应chenyurong数据库。

上面使用db.user.find()查询的结果没有格式化,不便于阅读。咱们可使用pretty()函数使其输出格式化。

> db.user.find().pretty() { "_id" : ObjectId("59abb034dca9453471d67f13"), "name" : "chenyurong", "age" : 25, "addr" : "ShenZhen" }

文章首发于【博客园-陈树义】,点击跳转到原文MongoDb入门教程

MongoDb查询数据

为了方便演示接下来的查询功能,咱们这里运行如下命令清空数据库表user,并向其中插入一些测试数据。

//清空当前数据库下user表的全部数据
> db.user.remove({})
WriteResult({ "nRemoved" : 2 }) //查看user表的全部数据 > db.user.find() //批量插入数据 > db.user.insert([ ... { ... "name": "ChenYuRong", ... "age": 25, ... "addr": "ShenZhen" ... }, ... { ... "name": "LiQiLiang", ... "age": 27, ... "addr": "GuangZhou" ... }, ... { ... "name": "XiaoPai", ... "age": 30, ... "addr": "BeiJing" ... }, ... { ... "name": "YuChangHui", ... "age": 32, ... "addr": "FuJian" ... }, ... { ... "name": "XiaoHei", ... "age": 28, ... "addr": "ShenZhen" ... }, ... { ... "name": "AnQi", ... "age": 20, ... "addr": "JieYang" ... }] ... ) BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 6, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })

此时 user 表中的数据列表以下:

name age addr
ChenYuRong 25 ShenZhen
LiQiLiang 27 GuangZhou
XiaoPai 30 BeiJing
YuChangHui 32 FuJian
XiaoHei 28 ShenZhen
AnQi 20 JieYang

MongoDB 查询数据的语法格式以下:

db.collection.find(query, projection)
  • query(可选):使用查询操做符指定查询条件。该参数是一个JSON对象,key 通常为查询的列名,value 为查询匹配的值。
  • projection(可选):使用投影操做符指定返回的键。若是省略该参数,那么查询时返回文档中全部键值。该参数是一个JSON对象,key 为须要显示的列名,value 为 1(显示) 或 0(不显示)。

下面的查询语句将user表中地址(addr)为ShenZhen,年龄(age)为25的数据筛选出来,而且在结果中不显示ID列:

db.user.find({"addr":"ShenZhen","age":25},{"_id":0}).pretty()

查询结果为:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" }

范围操做符

范围操做符指的是:大于、大于等于、等于、不等于、小于、小于等于操做符,在 MongoDb 中它们的表示以及使用以下面表格所示:

操做 格式 范例 RDBMS中的相似语句
等于 {:} db.col.find({"by":"MongoDb入门教程"}).pretty() where by = 'MongoDb入门教程'
小于 {:{$lt:}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

例如我要查询用户表中全部年龄大于等于25岁的用户,那么查询语句为:

db.user.find({"age": {$gte:25}},{"_id":0}).pretty()

查询结果为:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "name" : "LiQiLiang", "age" : 27, "addr" : "GuangZhou" } { "name" : "XiaoPai", "age" : 30, "addr" : "BeiJing" } { "name" : "YuChangHui", "age" : 32, "addr" : "FuJian" } { "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

AND操做符

MongoDB 的 find() 方法能够传入多个键(key),每一个键(key)以逗号隔开。每一个键(key)之间是与的逻辑关系。

例如我要查询用户表(user)中地址为ShenZhen且年龄大于等于25岁的用户,那么查询语句为:

db.user.find({"addr": "ShenZhen","age": {$gte:25}},{"_id":0}).pretty()

查询结果为:

{ "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

OR操做符

MongoDB 中关键字$or表示或逻辑关系,其语法格式以下:

db.col.find(
   {
 $or: [ {key1: value1}, {key2:value2} ] } ).pretty()

例如我要查询用户表(user)中地址为ShenZhen或者年龄大于等于30岁的用户,那么查询语句为:

db.user.find({$or:[{"addr":"ShenZhen"},{"age":{$gte:30}}]}).pretty()

查询结果为:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f17"), "name" : "XiaoPai", "age" : 30, "addr" : "BeiJing" } { "_id" : ObjectId("59ac1c57dca9453471d67f18"), "name" : "YuChangHui", "age" : 32, "addr" : "FuJian" } { "_id" : ObjectId("59ac1c57dca9453471d67f19"), "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

AND操做符和OR操做符能够混合使用,例如要实现如下SQL查询:

select * from user where name = "ChenYuRong" or (age <= 25 and addr == "JieYang")

那么该 MongoDb 查询语句应该这样写:

db.user.find({$or:[{"name":"ChenYuRong"}, {"age": {$lte:25}, "addr": "JieYang"}]}).pretty()

查询结果为:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f1a"), "name" : "AnQi", "age" : 20, "addr" : "JieYang" }

排序

在 MongoDB 中使用使用 sort() 方法对数据进行排序,sort() 方法能够经过参数指定排序的字段,并使用 1 和 -1 来指定排序的方式,其中 1 为升序排列,而-1是用于降序排列。

sort()方法基本语法以下所示:

db.collection.find().sort({KEY:1})

其中KEY表示要进行排序的字段。

例如咱们将全部年龄小于30岁的用户查询出来并将其按照年龄升序排列:

db.user.find({"age":{$lt:30}}).sort({age:1}).pretty()

查询结果为:

{
    "_id" : ObjectId("59ac1c57dca9453471d67f1a"), "name" : "AnQi", "age" : 20, "addr" : "JieYang" } { "_id" : ObjectId("59ac1c57dca9453471d67f15"), "name" : "ChenYuRong", "age" : 25, "addr" : "ShenZhen" } { "_id" : ObjectId("59ac1c57dca9453471d67f16"), "name" : "LiQiLiang", "age" : 27, "addr" : "GuangZhou" } { "_id" : ObjectId("59ac1c57dca9453471d67f19"), "name" : "XiaoHei", "age" : 28, "addr" : "ShenZhen" }

聚合

MongoDB中聚合的方法使用aggregate(),其基本的语法格式以下:

db.collection.aggregate(AGGREGATE_OPERATION)

其中AGGREGATE_OPERATION的格式为:

[
    {
        $group: {
            _id: {
                addr: '$addr'
            },
            totalCount: {
                $sum: 1 } } } ]
  • $group是固定的,表示这里一个分组聚合操做。
  • _id表示须要根据哪一些列进行聚合,其实一个JSON对象,其key/value对分别表示结果列的别名以及须要聚合的的数据库列。
  • totaoCount表示聚合列的列名。
  • $sum表示要进行的聚合操做,后面的1表示每次加1。

例如要根据地区统计用户人数,那么查询语句为:

db.user.aggregate([{$group:{_id:{userAddr:'$addr'},totalCount:{$sum:1}}}])

查询结果为:

{ "_id" : { "userAddr" : "FuJian" }, "totalCount" : 1 } { "_id" : { "userAddr" : "JieYang" }, "totalCount" : 1 } { "_id" : { "userAddr" : "BeiJing" }, "totalCount" : 1 } { "_id" : { "userAddr" : "GuangZhou" }, "totalCount" : 1 } { "_id" : { "userAddr" : "ShenZhen" }, "totalCount" : 2 }

MongoDb更新数据

update() 方法用于更新已存在的文档。语法格式以下:

db.collection.update(
   <query>, <update>, {  upsert: <boolean>,  multi: <boolean>,  writeConcern: <document> } )
  • query:对哪些数据进行更新操做。
  • update:对这些数据作什么操做。
  • upsert(可选):若是不存在update的记录,是否将其做为记录插入。true为插入,默认是false,不插入。
  • multi(可选):是否更新多条记录。MongoDb 默认是false,只更新找到的第一条记录。若是这个参数为true,就把按条件查出来多条记录所有更新。
  • writeConcern(可选):表示抛出异常的级别。

例如咱们更新user表名为chenyurong的记录,将其年龄更改成25岁。

db.user.update({'name':'chenyurong'},{$set:{'age':25}})

其中$set表示进行赋值操做。

MongoDb删除数据

MongoDB中聚合的方法使用remove(),其基本的语法格式以下:

db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
  • query(可选):删除的文档的条件。
  • justOne(可选):若是设为 true 或 1,则只删除一个文档。
  • writeConcern(可选):抛出异常的级别。

例如咱们想删除名字(name)为LiQiLiang的用户,那么该删除语句为:

> db.user.remove({"name":"LiQiLiang"}) WriteResult({ "nRemoved" : 1 }) > db.user.find({"name":"LiQiLiang"}).pretty() > 

若是你想删除全部数据,可使用如下方式(相似常规 SQL 的 truncate 命令):

>db.col.remove({}) >db.col.find() >

经常使用的DDL命令

  • 查看当前数据库:db
  • 查看全部数据库:show dbs
  • 查看当前数据库全部集合(表格):show collections

MongoDb图形化工具

若是你是企业版的用户,能够尝试使用:企业版用户:MongoDb Compass

若是你跟我同样是我的用户,并且也同样使用 JetBrain 编辑器,那么你能够试试 JetBrain 的一款插件:JetBrain Plugin:mongo4idea

另外的一款 GUI 图形化工具能够做为备用工具使用:NoSQL for MongoDb(Windows使用)

总结

此次咱们从服务器的安装到链接,再介绍了如 MongoDb 最基本的 CURD 操做。

看到这里是否是以为 MongoDb 仍是蛮简单的呢,来动手作作几道题看是否真的彻底掌握了吧。

  • 查询出user表中用户年龄小于25岁的用户,并按照年龄升序排列。
  • 查询出user表中用户年龄大于25岁而且地址在深圳的用户。
  • 查询出user表中用户年龄大于25岁而且地址在深圳,或者地址在北京的用户。
  • 统计出user表中各个城市的用户人数。

若是遇到问题,记得在文章下评论哦。

参考资料

文章首发于【博客园-陈树义】,点击跳转到原文MongoDb入门教程