0%

MongoDB 初探

MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写,旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。本文讲述 MongoDB 的入门级安装和使用。

1. 安装

方法一:

MongoDB 官网下载中心 下载社区版(Community Server)进行安装。步骤分为三步走:下载、解压、加入环境变量。

方法二:

笔者的安装环境为 Mac OS X 10.13,此处为了方便直接使用 HomeBrew 工具进行安装,命令如下:

1
2
3
4
5
# 更新软件列表
brew update

# 安装 MongoDB
brew install mongodb

2. 运行

(1)Server 端

直接键入 mongod 命令即可运行 Server 端并监听,或者通过以下命令同时指定存放数据的文件目录:

1
2
# 指定数据存放的文件目录来运行
mongod --dbpath <path to data directory>

注意,此处命令为 mongod 不是 mongodb !!!

其次,如果不指定数据存放目录,则会使用 /data/db 目录,需要手动创建该目录

等待终端最后一行输出以下内容表示运行成功:

1
2018-01-22T11:43:39.802+0800 I NETWORK  [initandlisten] waiting for connections on port 27017

(2)Client 端

Mongo Shell 是 MongoDB 的一个 JavaScript 交互式接口,用户通过该接口来实现对数据的查询和管理。

新开一个终端窗口,通过以下命令来开启 Mongo Shell 接口来操作数据库,此处在同一主机上运行:

1
2
# 启动 mongo shell
mongo --host 127.0.0.1:27017

再次注意,此处的命令是 mongo,不是 mongod,也不是 mongodb !!!

不带参数,默认将访问 localhost:27017

等待终端出现待键入界面,表明连接成功:

1
>

3. 使用

安装完毕后的使用,可以参考 MongoDB 的 官方教程,本文将简要讲述基本的入门使用教程。

3.1 Mongo Shell

(1)切换数据库

1
2
3
4
5
6
7
8
# 显示所有可用的数据库
> show dbs

# 显示当前数据库,第一次进入默认为 test 数据库
> db

# 切换数据库使用 use <database> 命令
> use myDB

第一次使用 use 命令切换或使用 collection 插入数据时,如果 db 或者 collection 不存在,则会自动创建

(2)Collection

1
2
3
4
5
# 获取 Collection 使用 db.<collection name> 语法
> db.myCollection

# 可通过 db.getCollection("name") 函数获取包含 Shell 非法字符的 Collection
> db.getCollection("myCollection")

3.2 CRUD

3.2.1 增加记录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 插入单条记录
# db.collection.insertOne(
# <document>,
# {
# writeConcern: <document>
# }
# )
> db.user.insertOne( {name: "zhangsan", age: 18, status: { online: true } } )

# 插入多条记录
# db.collection.insertMany(
# [ <document 1> , <document 2>, ... ],
# {
# writeConcern: <document>,
# ordered: <boolean>
# }
# )
> db.user.insertMany( [
... {name: "lisi", age: 18, status: { online: false } },
... {name: "wangwu", age: 20, status: { online: true } }
... ] )

# 或者 db.collection.insert() 插入一条或多条记录

增加记录涉及到的行为:

  • 自动创建,如果被插入的 Collection 不存在,将会被自动创建
  • _id 字段,如果被插入数据没有 _id 字段,将自动增加该字段作为主键
  • 原子性,所有写入操作均为原子性的操作
  • 写入 ACK,可以指定写入执行结果的 ACK 级别

3.2.2 查询记录

1
2
# 查询所有记录 find(),等价于 find({})
> db.user.find()

末尾加上 .pretty() 可以以 json 排版更好地展示结果

可以指定查询条件,相当于 SQL 的 WHERE 关键字。

(1)明确相等条件

1
2
# 键值对语法指定相等条件 { <field1>: <value1>, ... }
> db.user.find( { name: "lisi" } )

值可以为正则表达式,使用两个 / 符号包括起来

(2)操作符指定条件

1
2
# 操作符语法指定条件 { <field1>: { <operator1>: <value1> }, ... }
> db.user.find( { name: { $in: [ "zhangsan", "lisi" ] } } )

$or 操作符在此处具备同样的效果,但注意 $in 作用在同一字段,$or$and 是对应的操作符

其中,比较条件操作符有以下:

  • $eq 相等
  • $ne 不等于
  • $gt 大于
  • $lt 小于
  • $gte 大等于
  • $lte 小等于
  • $in 包含
  • $nin 不包含

(3)且和或条件

1
2
# And 条件,多个属性并列即为 And 条件
> db.user.find( { age: { $lte: 18 }, name: "lisi"} )
1
2
# Or 条件,使用 $or 操作符来指定 Or 条件
> db.user.find( { $or: [{name: "lisi"}, {age: {$gt: 18}}] } )

3.2.3 修改记录

1
2
3
4
# 三种函数可用于修改记录
# db.collection.updateOne(<filter>, <update>, <options>)
# db.collection.updateMany(<filter>, <update>, <options>)
# db.collection.replaceOne(<filter>, <replacement>, <options>)
1
2
3
4
5
6
7
8
# 更新一条记录
> db.user.updateOne(
... { name: "lisi" },
... {
... $set: { "name": "Lisi", age: 19 },
... $currentDate: { lastModified: true }
... }
... )
1
2
3
4
5
6
7
8
# 更新多条满足条件的记录
> db.user.updateMany(
... { age: { $lt: 20 } },
... {
... $set: { age: 18 },
... $currentDate: { lastModified: true }
... }
... )

其中,$currentDate 操作符用于修改时间字段,如果没有 lastModified 字段,将创建该字段。

1
2
3
4
5
# 替换记录
> db.user.replaceOne(
... { name: "wangwu" },
... { name: "wangwu", age: 20 }
... )

替换记录,会替换除 _id 字段的正文内容。

3.2.4 删除记录

删除记录比较简单,deleteMany() 和 deleteOne() 两个函数,参数传递条件即可。

1
2
# 删除多条记录
> db.user.deleteMany( { a: { $gt: 0 } } )

同样,条件可以指定 {} 用来删除所有记录

删除操作不会删除索引,除非删除一个集合的所有记录

总结

本文简要讲解了 MongoDB 的入门级安装和使用,帮助读者简要了解 MongoDB,此文讲解的内容只是 MongoDB 的冰山一角,如需使用到更高级的功能还需要读者进一步地学习。