MogoDb快速入门

一,简介
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写,旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB是一个介于关系型数据库和非关系型数据库之间的产品,是非关系型数据库当中功能最丰富,最像关系型数据库的。

二,安装
windows下安装

运行MongoDB安装包并选择自定义安装,设置好安装路径;


image.png

配置MongoDB,让MongoDB作为服务运行,并配置好数据目录和日志目录;


image.png

取消MongoDB Compass的安装选项(不取消安装极慢),需要可自行安装;


image.png

双击mongo.exe可以运行MongoDB自带客户端,操作MongoDB;


image.png

连接成功后会显示如下信息;


image.png

如果需要移除MongoDB服务,只需使用管理员权限运行cmd工具,并输入如下命令。
sc.exe delete MongoDB

Linux下的安装
下载MongoDB的Docker镜像;
docker pull mongo:4.2.5

使用Docker命令启动MongoDB服务;
docker run -p 27017:27017 --name mongo
-v /mydata/mongo/db:/data/db
-d mongo:4.2.5

有时候我们需要为MongoDB设置账号,可以使用如下命令启动;
docker run -p 27017:27017 --name mongo
-v /mydata/mongo/db:/data/db
-d mongo:4.2.5 --auth

然后我们需要进入容器中的MongoDB客户端;
docker exec -it mongo mongo

之后在admin集合中创建一个账号用于连接,这里创建的是基于root角色的超级管理员帐号;
use admin
db.createUser({
user: 'mongoadmin',
pwd: 'secret',
roles: [ { role: "root", db: "admin" } ] });

创建完成后验证是否可以登录;
db.auth("mongoadmin","secret")

整个账号创建过程可以参考下图。


image.png

三,客户端工具
MongoDB的客户端工具有很多,上面没安装的MongoDB Compass就是其中之一,另外Navicat 15版本也有MongoDB的管理功能。这里我们使用的是一款免费的客户端工具Robo 3T(以前叫Robomongo)。

下载完成后解压,双击robo3t.exe即可使用;


image.png

之后创建一个到MongoDB的连接;


image.png

创建连接成功以后,就可以操作MongoDB了。


image.png

四,相关概念
MongoDB是非关系型数据库当中最像关系型数据库的,所以我们通过它与关系型数据库的对比,来了解下它的概念。


image.png

五,数据库操作
创建数据库,使用use命令去创建数据库,当插入第一条数据时会创建数据库,例如创建一个test数据库;

use test
switched to db test
db.article.insert({name:"MongoDB 教程"})
WriteResult({ "nInserted" : 1 })
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
test 0.000GB

删除数据库,使用db对象中的dropDatabase()方法来删除;

db.dropDatabase()
{ "dropped" : "test", "ok" : 1 }
show dbs
admin 0.000GB
config 0.000GB
local 0.000GB

六,集合操作
创建集合,使用db对象中的createCollection()方法来创建集合,例如创建一个article集合;

use test
switched to db test
db.createCollection("article")
{ "ok" : 1 }
show collections
article

删除集合,使用collection对象的drop()方法来删除集合,例如删除一个article集合;

db.article.drop()
true
show collections

七,文档操作
上面的数据库和集合操作是在MongoDB的客户端中进行的,下面的文档操作都是在Robomongo中进行的。

插入文档
MongoDB通过collection对象的insert()方法向集合中插入文档,语法如下;
db.collection.insert(document)

使用collection对象的insert()方法来插入文档,例如插入一个article文档;
db.article.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'Andy',
url: 'https://www.mongodb.com/',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

使用collection对象的find()方法可以获取文档,例如获取所有的article文档;
db.article.find({})
{
"_id" : ObjectId("5e9943661379a112845e4056"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100.0
}

更新文档
MongoDB通过collection对象的update()来更新集合中的文档,语法如下;
db.collection.update(
<query>,
<update>,
{
multi: <boolean>
}
)

query:修改的查询条件,类似于SQL中的WHERE部分

update:更新属性的操作符,类似与SQL中的SET部分

multi:设置为true时会更新所有符合条件的文档,默认为false只更新找到的第一条

将title为MongoDB 教程的所有文档的title修改为MongoDB;
db.article.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})

除了update()方法以外,save()方法可以用来替换已有文档,语法如下;
db.collection.save(document)
这次我们将ObjectId为5e9943661379a112845e4056的文档的title改为MongoDB 教程;

db.article.save({//不推荐,更新时必须写所有的字段,如果字段不全,则不全的字段会丢失
"_id" : ObjectId("5e9943661379a112845e4056"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100.0
})

删除文档
MongoDB通过collection对象的remove()方法来删除集合中的文档,语法如下;
db.collection.remove(
<query>,
{
justOne: <boolean>
}
)

query:删除的查询条件,类似于SQL中的WHERE部分

justOne:设置为true只删除一条记录,默认为false删除所有记录

删除title为MongoDB 教程的所有文档;
db.article.remove({'title':'MongoDB 教程'})

查询文档
MongoDB通过collection对象的find()方法来查询文档,语法如下;
db.collection.find(query, projection)

query:查询条件,类似于SQL中的WHERE部分

projection:可选,使用投影操作符指定返回的键

查询article集合中的所有文档;
db.article.find()
/* 1 */
{
"_id" : ObjectId("5e994dcb1379a112845e4057"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "Andy",
"url" : "https://www.mongodb.com/",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 50.0
}

/* 2 */
{
"_id" : ObjectId("5e994df51379a112845e4058"),
"title" : "Elasticsearch 教程",
"description" : "Elasticsearch 是一个搜索引擎",
"by" : "Ruby",
"url" : "https://www.elastic.co/cn/",
"tags" : [
"elasticearch",
"database",
"NoSQL"
],
"likes" : 100.0
}

/* 3 */
{
"_id" : ObjectId("5e994e111379a112845e4059"),
"title" : "Redis 教程",
"description" : "Redis 是一个key-value数据库",
"by" : "Andy",
"url" : "https://redis.io/",
"tags" : [
"redis",
"database",
"NoSQL"
],
"likes" : 150.0
}

MongoDB中的条件操作符,通过与SQL语句的对比来了解下;


image.png

条件查询,查询title为MongoDB 教程的所有文档;
db.article.find({'title':'MongoDB 教程'})

条件查询,查询likes大于50的所有文档;
db.article.find({'likes':{$gt:50}})

AND条件可以通过在find()方法传入多个键,以逗号隔开来实现,例如查询title为MongoDB 教程并且by为Andy的所有文档;
db.article.find({'title':'MongoDB 教程','by':'Andy'})

OR条件可以通过使用or操作符实现,例如查询title为Redis 教程或MongoDB 教程的所有文档; db.article.find({or:[{"title":"Redis 教程"},{"title": "MongoDB 教程"}]})

AND 和 OR条件的联合使用,例如查询likes大于50,并且title为Redis 教程或者"MongoDB 教程的所有文档。
db.article.find({"likes": {gt:50},or: [{"title": "Redis 教程"},{"title": "MongoDB 教程"}]})

八,其他操作
Limit与Skip操作
读取指定数量的文档,可以使用limit()方法,语法如下;
db.collection.find().limit(NUMBER)

只查询article集合中的2条数据;
db.article.find().limit(2)

跳过指定数量的文档来读取,可以使用skip()方法,语法如下;
db.collection.find().limit(NUMBER).skip(NUMBER)

从第二条开始,查询article集合中的2条数据;
db.article.find().limit(2).skip(1)

排序
在MongoDB中使用sort()方法对数据进行排序,sort()方法通过参数来指定排序的字段,并使用1和-1来指定排序方式,1为升序,-1为降序;
db.collection.find().sort({KEY:1})

按article集合中文档的likes字段降序排列;
db.article.find().sort({likes:-1})

索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。

MongoDB使用createIndex()方法来创建索引,语法如下;
db.collection.createIndex(keys, options)

background:建索引过程会阻塞其它数据库操作,设置为true表示后台创建,默认为false

unique:设置为true表示创建唯一索引

name:指定索引名称,如果没有指定会自动生成

给title和description字段创建索引,1表示升序索引,-1表示降序索引,指定以后台方式创建;
db.article.createIndex({"title":1,"description":-1}, {background: true})

查看article集合中已经创建的索引;
db.article.getIndexes()
/* 1 */
[
{
"v" : 2,
"key" : {
"id" : 1
},
"name" : "id",
"ns" : "test.article"
},
{
"v" : 2,
"key" : {
"title" : 1.0,
"description" : -1.0
},
"name" : "title_1_description
-1",
"ns" : "test.article",
"background" : true
}
]

聚合
MongoDB中的聚合使用aggregate()方法,类似于SQL中的group by语句,语法如下;
db.collection.aggregate(AGGREGATE_OPERATION)
聚合中常用操作符如下;


image.png

根据by字段聚合文档并计算文档数量,类似与SQL中的count()函数;
db.article.aggregate([{group : {_id : "by", sum_count : {$sum : 1}}}])
/* 1 */
{
"_id" : "Andy",
"sum_count" : 2.0
}

/* 2 */
{
"_id" : "Ruby",
"sum_count" : 1.0
}

根据by字段聚合文档并计算likes字段的平局值,类似与SQL中的avg()语句;
db.article.aggregate([{group : {_id : "by", avg_likes : {avg : "likes"}}}])
/* 1 */
{
"_id" : "Andy",
"avg_likes" : 100.0
}

/* 2 */
{
"_id" : "Ruby",
"avg_likes" : 100.0
}

正则表达式
MongoDB使用$regex操作符来设置匹配字符串的正则表达式,可以用来模糊查询,类似于SQL中的like操作;

例如查询title中包含教程的文档;
db.article.find({title:{$regex:"教程"}})

不区分大小写的模糊查询,使用options操作符; db.article.find({title:{regex:"elasticsearch",options:"i"}})

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,295评论 6 512
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,928评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,682评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,209评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,237评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,965评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,586评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,487评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,016评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,136评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,271评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,948评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,619评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,139评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,252评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,598评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,267评论 2 358

推荐阅读更多精彩内容