MongoDB 入门

sankigan2021-4-20后端MongoDB

1. 安装(macOS)

MongoDB 下载地址:https://www.mongodb.com/download-center#community

也可以使用 curl 命令来下载安装:

# 进入 /usr/local
cd /usr/local

# 下载
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-macos-x86_64-4.2.6.tgz

# 解压
sudo tar -zxvf mongodb-macos-x86_64-4.2.6.tgz

# 重命令为 mongodb 目录
sudo mv mongodb-macos-x86_64-4.2.6/ mongodb

安装完成后,可以把 MongoDB 的二进制命令文件目录添加到 PATH 路径中:

export PATH=/usr/local/mongodb/bin:$PATH

注意:如果使用了zsh,则需要将该配置添加到 ~/.zshrc 文件中。

最后,输入 mongod --version 测试是否安装成功。

2. 启动和关闭数据库

启动

MongoDB 默认使用 /data/db 作为数据存储目录,但如果 mac 已更新到 Catalina 系统,则根文件夹不再可写。第一种解决方案是先将安全模式关闭,再创建 /data/db 文件夹,最后再打开电脑的安全模式;鉴于第一种方案太麻烦,因此也可以在每次启动 MongoDB 数据库时都指定 MongoDB 数据库路径:

sudo mongod --dbpath=/Users/user/data/db

关闭

Ctrl + c

3. 连接和退出数据库

连接

在启动 MongoDB 数据库时,再打开一个终端输入:

mongo

退出

Ctrl + c

4. 基本概念

  • 可以有多个数据库
  • 一个数据库中可以有多个集合(数据表)
  • 一个集合中可以有多个文档(记录)
  • 文档结构没有任何限制
  • 不需要先创建数据库、表、设计表结构,当插入文档的时候,只需要指定往哪个数据库的哪个集合操作就可以了,一切都由 MongoDB 自动完成建库建表
{
	"db": {
		"collection": [
			{"name": "Jack", "age": 20},
			{"name": "Pony", "age": 22},
			{"name": "Sasha", "age": 23}
		]
	}
}

5. 基本命令

命令含义
show dbs查看所有数据库
db查看当前操作数据库
use DATABASE_NAME切换到指定的数据库(如果没有会新建)
show collections查看已有集合
db.users.insert({"name": "SANKI"})向集合中插入文档
db.users.find()查询集合中的文档

MongoDB 中默认的数据库为 test,如果没有创建新的数据库,集合将存放在 test 数据库中。

注意:在 MongoDB 中,集合只有在内容插入后才会创建!也就说,创建集合(数据表)后要再插入一个文档(记录),集合才会真正创建。

6. 在 Node 中如何操作 MongoDB 数据库

官方 MongoDB 包

https://github.com/mongodb/node-mongodb-native

第三方 mongoose 包

https://mongoosejs.com/

起步

安装:npm i mongoose

DEMO:

const mongoose = require('mongoose');
mongoose.connect('mongodb://127.0.0.1:27017/test', {useNewUrlParser: true, useUnifiedTopology: true});

const Cat = mongoose.model('Cat', { name: String });

const kitty = new Cat({ name: 'Zildjian' });
kitty.save().then(() => console.log('meow'));

官方指南

设计 Scheme 发布 Model

const mongoose = require('mongoose')
const Schema = mongoose.Schema

// 1. 连接数据库
// 指定连接的数据库不需要存在,当插入第一条数据之后就会自动被创建出来
mongoose.connect('mongodb://127.0.0.1:27017/test')

// 2. 设计文档结构(表结构)
// 字段名称就是表结构中的属性名称
// 约束的目的是为了保证数据的完整性,不要有脏数据
const userSchema = new Schema({
  username: {
    type: String,
    required: true
  },
  password: {
    type: String,
    required: true
  },
  email: {
    type: String
  }
})

// 3. 将文档结构发布为模型
// mongoose.model 方法用来将一个架构发布为 model
// 第一个参数:传入一个答大写名词单数字符串用来表示数据库名称
//           mongoose 会自动将大写名词的字符串生成小写复数的集合名称
//           例如这里的 User 最终会变味 users 集合名称
// 第二个参数:文档结构
// 返回值:模型构造函数
const User = mongoose.model('User', userSchema)

// 当有了模型构造函数之后,就可以使用这个构造函数对 users 集合中的数据进行增删改查操作

增加数据

const admin = new User({
  username: 'admin',
  password: '123456',
  email: 'admin@admin.com'
})

admin.save().then(value => {
  console.log(value)
}, reason => {
  console.error(reason)
})

查询数据

// ⭐️ 查询所有,返回数组
User.find().then(value => {
  console.log(value)
}, reason => {
  console.error(reason)
})

// ⭐️ 按条件查询所有,返回数组
User.find({
  username: 'admin'
}).then(value => {
  console.log(value)
}, reason => {
  console.error(reason)
})

// ⭐️ 按条件查询单个,返回一个对象
User.findOne({
  username: 'admin'
}).then(value => {
  console.log(value)
}, reason => {
  console.error(reason)
})

删除数据

// ⭐️ 根据指定条件删除一个
User.deleteOne({
  username: 'sanki'
}).then(value => {
  console.log(value)
}, reason => {
  console.error(reason)
})
Model.findOneAndRemove(conditions [, options] [, callback])

// ⭐️ 根据指定条件删除所有
Model.deleteMany(conditions [, callback])

// ⭐️ 根据id删除一个
Model.findByIdAndRemove(id [, options] [, callback])

更新数据

// ⭐️ 根据指定条件更新一个
Model.findOneAndUpdate([conditions] [, update] [, options] [, callback])
Model.updateOne(conditions, doc [, options] [, callback])

// ⭐️ 根据条件更新所有
Model.update(conditions, doc [, options] [, callback])
Model.updateMany(conditions, doc [, options] [, callback])

// ⭐️ 根据id更新一个
Model.findByIdAndUpdate(id [, update] [, options] [, callback])