MongoDb 快速入门教程
文章首发于【博客园-陈树义】,点击跳转到原文MongoDb 快速入门教程。
MongoDb 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
它是可扩展的高性能数据存储解决方案,经常被用于非关系型数据的存储,能存储海量的数据。
常见的非关系型数据库还有:Redis,但 MongoDb 比 redis 更具有数据库的特性。
MongoDb的基本数据结构
与 MySQL 等关系型数据库一样,MongoDb 也有类似的概念,但是其称呼不同。下表列出了 MongoDb 的基本数据结构以及与 MySQL 的对比。
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)。
安装MongoDb服务器
MongoDB 提供了 OSX 平台上 64 位的安装包,你可以在官网下载安装包。
下载地址:MongoDb Download Center | MongoDB
下载后解压文件并做好PATH路径配置:
# 解压文件
tar -zxvf mongodb-osx-x86_64-3.4.7.tgz
# 配置${mongodb_home}/bin到PATH路径
export PATH=<mongodb-install-directory>/bin:$PATH
创建数据库存储目录:
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 快速入门教程。
MongoDb 快速入门教程的更多相关文章
- MongoDB快速入门教程 (3.2)
3.2.索引 索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,建立索引,通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条 ...
- MongoDB快速入门教程 (4.4)
4.5.Mongoose索引和方法 4.5.1.设置索引 let UserSchema = mongoose.Schema({ sn: { type: Number, // 设置唯一索引 unique ...
- MongoDB快速入门教程 (4.3)
4.3.Mongoose模块化 4.3.1.为什么要进行模块化拆分? 模块化拆分的目的是为了代码的复用,让整个项目的结构更加清晰,举个例子:当数据库中的集合变多的时候,例如有课程.订单.分类.教师等多 ...
- MongoDB快速入门教程 (4.2)
4.2.Mongoose实现增删查改 中文文档地址: https://cn.mongoosedoc.top/docs/guide.html 4.2.1.Mongoose是什么? Mongoose是Mo ...
- MongoDB快速入门教程 (4.1)
4.Mongoose使用 4.1.nodejs操作mongodb 文档地址:http://mongodb.github.io/node-mongodb-native/3.2/tutorials/cru ...
- MongoDB快速入门教程 (3.3)
3.4.聚合 3.4.1.什么是聚合? MongoDB中聚合(aggregate)主要用于处理数据(诸如统计平均值,求和等),并返回计算后的数据结果.有点类似sql语句中的 count(*) 例如上图 ...
- MongoDB快速入门教程(3.1)
3.MongoDB进阶 3.1.权限验证 以下内容适用于Mac系统用户,window系统用户请看后面文档 3.1.1.创建超级管理员用户 默认情况下连接mongodb是不需要用户名和密码的,这样不安全 ...
- MongoDB快速入门教程 (2)
2.MongoDB的基本的CRUD操作 2.1.创建文档 在具体操作之前,想要知道有多少数据库,可以执行下面命令 show dbs 在mongodb中,数据库中包含的叫做集合(表),集合中存储的内容叫 ...
- MongoDB快速入门教程 (1)
1.MongoDB初识 1.1.MongoDB是什么? MongoDB是一个基于分布式文件存储的数据库.由C++语言编写.旨在为WEB应用提供可扩展的高性能数据存储解决方案. MongoDB是一个介于 ...
随机推荐
- 【分享】iTOP4412开发板-Bluetooth移植文档
[分享]iTOP4412开发板-Bluetooth移植文档 最近须要把Bluetooth移植到iTOP-4412 开发平台.查阅了相关资料,经过一段时间的研究.调试,最终成功的将蓝牙功能移植到了开发板 ...
- 重要经验五:block作为属性的注意事项
现代ios应用的开发.不使用GCD和block,效率会减少非常多,在今年3月份之前,我在block的学习和使用方面,精力和经验都明显不足,在SF有个牛逼同事.不仅自己积累了一套库,并且对这个库持续进行 ...
- python集合增删改查,深拷贝浅拷贝
集合 集合是无序的,不重复的数据集合,它里面的元素是可哈希的(不可变类型),但是集合本身是不可哈希(所以集合做不了字典的键)的.以下是集合最重要的两点: 去重,把一个列表变成集合,就自动去重了. 关系 ...
- 一个Web前端自学者的自述
想来想去还是写下这篇文章,先说明,我精通JAVA编程语言和web前端常见的技术,个人是做JAVA的多,但是更加喜欢前端.因为我从高一开始接触JAVA,家父是黑马的JAVA讲师,自己对编程很热爱,在大学 ...
- 《大型网站技术架构:核心原理与案例分析》【PDF】下载
<大型网站技术架构:核心原理与案例分析>[PDF]下载链接: https://u253469.pipipan.com/fs/253469-230062557 内容简介 本书通过梳理大型网站 ...
- Hosts文件实际应用 配置内部服务器提高访问效率和速度
一 hosts文件的作用和介绍 https://jingyan.baidu.com/article/335530da45485e19cb41c3d6.html https://www.cnblogs. ...
- 转载|chrome developer tool—— 断点调试篇
断点,调试器的功能之一,可以让程序中断在需要的地方,从而方便其分析.也可以在一次调试中设置断点,下一次只需让程序自动运行到设置断点位置,便可在上次设置断点的位置中断下来,极大的方便了操作,同时节省了时 ...
- Docker(八):Docker端口映射
1.随机映射 docker run -P -d --name mynginx1 nginx [root@node1 ~]# docker ps -l CONTAINER ID IMAGE COMMAN ...
- Spring Dynamic DataSource Routing
Use AbstractRoutingDataSource to dynamicly switch datasources, see http://spring.io/blog/2007/01/23/ ...
- uEditor富文本编辑器
在配合vue和webpack使用时,在严格模式下注意会报错,需要修改配置. 我采用的方式:----不建议全部取消严格模式,因为一些插件必须要再严格模式才能运行的 对UEditor的严格模式报错文件,取 ...