数据库开发标题-MongoDB
2022年9月4日大约 3 分钟
使用 docker 安装
- 描述
MongoDB 中,数据库存放集合 Collection(相当于 MySQL 的表),集合中存放文档 Document
在 MongoDB 中,用户被限定在一个数据库中;新建一个数据库,须指定所属用户才能正常使用
- 准备
#mongo数据目录
mkdir /usr/local/docker/mongodb/data
#mongo日志目录
mkdir /usr/local/docker/mongodb/logs- 创建 yml 所需脚本 mongo-init.sh
cd /usr/local/docker/mongodb
vim mongo-init.sh此脚本用于给初始库指定用户名、密码和权限。此用户能否用于登录可以自己试试。
mongo -- "$MONGO_INITDB_DATABASE" <<EOF
db.createUser({
user: "$MONGO_USERNAME",
pwd: "$MONGO_PASSWORD",
roles: [{ role: 'readWrite', db: '$MONGO_INITDB_DATABASE' }]
})
EOF- docker-compose.yml
cd /usr/local/docker/mongodb
vim docker-compose.ymlservices:
mongodb:
container_name: mongodb
image: mongo:6.0.3
ports:
- "27017:27017"
restart: always
command:
- "--auth"
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: "x+s-k#b!qd6848"
MONGO_INITDB_DATABASE: mydatabase
MONGO_USERNAME: zjx
MONGO_PASSWORD: zjx123321
volumes:
- "/opt/dockerstore/mongo/data:/data/db"
- "/opt/dockerstore/mongo/logs:/var/log/mongodb"
- "/usr/share/zoneinfo/Asia/Shanghai:/etc/localtime"
- ./mongo-init.sh:/docker-entrypoint-initdb.d/mongo-init.sh
networks:
docker:
external: true- 运行
docker-compose up -dNavicat 连接 MongoDB
Navicat 中使用 root 用户连接 MongoDB 时,认证数据库必须填写为 admin,因为 root 用户默认是在 admin 数据库中创建的。在 mongoosejs 中连接 MongoDB 时,创建的数据库认证信息(用户、密码)仍然是通过 admin 数据库进行验证。
mongoosejs 操作数据库
点击下载本节 node 服务端操作 MongoDB 完整示例
- 安装
$ npm install mongoose --save警告
注意,需在服务端(如 node 中)使用 mongoosejs,mongoose 永远不会在客户端运行,不信可以试试
数据库操作
Schema 用于定义 mongoose 文档结构; Model 可理解为数据库;documents 相当于数据库中的表;
import mongoose from "mongoose";
// 连接数据库
await mongoose
.connect("mongodb://127.0.0.1:27017", {
dbName: "my_db_name", // 若数据库不存在,MongoDB 会在第一次插入数据时自动创建该数据库
user: "root", // 认证信息和 admin 库一致
pass: "x+s-k#b!qd6848",
authMechanism: "SCRAM-SHA-256",
maxPoolSize: 200,
connectTimeoutMS: 3000,
})
.catch((error) => console.log(error));
// 定义Schema
var Schema = mongoose.Schema;
var userSchema = new Schema({
id: { type: [String], index: true }, // 索引
name: String,
age: Number,
});新增数据
/** 定义Model
* 参数说明 1. 集合名称 2. Schema数据
**/
var UserModel = mongoose.model("User", userSchema);
// 方式一
var user = new UserModel({
name: "zhangsan1",
age: 23,
sex: 1,
});
user.save((err, data) => {
console.log(data);
});
// 方式二
UserModel.create({ name: "zhangsan2" }, (err, data) => {
console.log(data);
});
// 方式三
UserModel.insertMany([{ name: "zhangsan3" }], function (err, data) {
console.log(err);
});数据查询
var UserModel = mongoose.model("User", userSchema);
// 全部查询 UserModel.find({})
// 方式一 完全匹配查询
UserModel.find({ name: "zhangsan", age: { $lt: 20 } }, function (err, data) {
console.log(data);
});
// 方式二 模糊查询
UserModel.find({ { name: /zhangsan/i }).where('age').lt(20).exec(callback);
// 方式三 只查询name和age字段
await UserModel.find({ name: /zhangsan/i }, 'name age').exec();数据修改
var UserModel = mongoose.model("User", userSchema);
// 方式一 (至多更新一个文档)
UserModel.updateOne({ age: 20 }, { name: "zhangsan" }, function (err, res) {});数据删除
var UserModel = mongoose.model("User", userSchema);
// 方式一(至多删除一个文档)
UserModel.deleteOne({ name: "zhangsan1" }, function (err) {
if (err) return handleError(err);
});
