目次
1. 基本的な考え方
Mongodb は分散ファイル ストレージに基づいたデータベースであり、正式なアドレスは
https://www.mongodb.com/です。
データベースの主な機能は、追加、削除、変更、クエリを実行できるデータの管理であり、構文も JavaScript に似ています。
データベースを使用する前に理解しておくべき 3 つの概念
(1) データベース:データウェアハウスであり、例えばデータベースの下に多数のコレクションが存在します(複数のテーブルとも解釈できます)(2) Collection: table、JavaScriptの退会フォームでは配列[ { id: 2 , name: Ultraman } ]として理解できます(3) ドキュメント: 一つのデータとして理解できます JavaScript における退会フォームは {id:2, name:ultraman} として理解できます
たとえば、js コードを使用します。
{
"users": [
{
"id": 1,
"name": "张三",
"age": 18,
},
{
"id": 2,
"name": "李四",
"age": 20,
},
],
"articles": [
{
"id": 1,
"title": "标题1",
"content": "内容1",
},
{
"id": 2,
"title": "标题2",
"content": "内容2",
},
],
}
コードでは、オブジェクト全体がデータベース (JSON ファイル) であり、その中に 2 つのコレクション (テーブル) が含まれており、ユーザーテーブルと記事テーブル ドキュメントは、あるテーブル内のデータとして理解できます。
もちろん、データベースは複数存在することもできますが、通常はプロジェクトごとに 1 つのデータベースが使用されます。
2.mongodをインストールする
ダウンロードアドレス:
https://www.mongodb.com/try/download/community
汎用性の高い
ジップ
タイプを選ぶのがおすすめです
構成手順は次のとおりです。
- 圧縮パッケージをC:\Program Filesに移動し、解凍します。
- C:\data\dbディレクトリを作成します。mongodbはデフォルトでこのフォルダーにデータを保存します。
- mongodbのbin ディレクトリを作業ディレクトリとして使用して、コマンド ラインを開始します。
- mongodコマンドを実行します
mongod は毎回 bin ディレクトリで実行する必要があるため、環境変数を使用して設定できます。
- ディレクトリ名をコピーします。例: C:\Program Files\mongodb-win32-x86_64-windows-5.0.19\bin
- 編集変数を開き、パスを見つけて、そのパスを追加します。
- 次回は cmd コマンド ウィンドウでテストできます。
3. コマンド対話データベース
コマンド対話とは、cmd コマンド ラインを介して対話することです。
(1) データベースコマンド
すべてのデータベースを表示
show dbs
指定したデータベースに切り替えます。データベースが存在しない場合は、データベースが自動的に作成されます。
use 数据库名
現在のデータベースを表示する
db
現在のデータベースを削除する
use 库名
db.dropDatabase()
(2)収集コマンド
コレクションを作成する
db.createCollection('集合名称')
現在のデータベース内のすべてのコレクションを表示します
show collections
コレクションを削除する
db.集合名.drop()
コレクションの名前を変更する
db.集合名.renameCollection('newName')
(3) ドキュメントコマンド
文書の挿入
db.集合名.insert(文档对象);
クエリ document_id は、 mongodb によって自動的に生成される一意の番号で、ドキュメントを一意に識別するために使用されます。
db.集合名.find(查询条件)
ドキュメントを更新する
db.集合名.update(查询条件,新的文档)
db.集合名.update({name:'张三'},{$set:{age:19}})
文書の削除
db.集合名.remove(查询条件)
4.マングース
//1. 安装 mongoose
//2. 导入 mongoose
const mongoose = require("mongoose");
//3. 连接数据库
mongoose.connect("mongodb://127.0.0.1:27017/bilibili");
//4. 设置连接回调
//连接成功
mongoose.connection.on("open", () => {
console.log("连接成功");
//5. 创建文档结构对象
let BookSchema = new mongoose.Schema({
title: String,
author: String,
price: Number,
});
//6. 创建文档模型对象
let BookModel = mongoose.model("book", BookSchema);
//7. 插入文档
BookModel.create(
{
title: "西游记",
author: "吴承恩",
price: 19.9,
},
(err, data) => {
if (err) throw err;
//输出 data 对象
console.log(data);
//8. 断开连接
mongoose.disconnect();
}
);
});
//连接出错
mongoose.connection.on("error", () => {
console.log("连接出错~~");
});
//连接关闭
mongoose.connection.on("close", () => {
console.log("连接关闭");
});
フィールドタイプ
title: String,
price: Number,
isHot: Boolean,
category: Array,
Date: Date,
Buffer: Buffer,
Mixed : mongoose.Schema.Types.Mixed, // 接收所有类型
ObjectId: mongoose.Schema.Types.ObjectId, // 主键 对象ID 用来查询其他表
Decimal: mongoose.Schema.Types.Decimal128, // 高精度类型
一部のキーは、フィールド検証用のオブジェクトの形式で書き込むこともできます。
(1) 必要なもの
title: {
type: String,
required: true // 设置必填项
}
(2)デフォルト値
author: {
type: String,
default: '匿名' //默认值
}
(3)列挙値
gender: {
type: String,
enum: ['男','女'] //设置的值必须是数组中的
}
(4)固有の値
username: {
type: String,
unique: true
}
効果を発揮するにはコレクションを再構築する
必要が
ある
(1) データを追加する
mongoose.connection.on("open", () => {
console.log("连接成功");
let BookSchema = new mongoose.Schema({
title: String,
author: String,
price: Number
});
let BookModel = mongoose.model('book', BookSchema);
BookModel.create({
title: "《水浒传》",
price: 15,
}).then((res) => {
console.log(res);
console.log("保存成功!");
})
});
次に、model.operation をコードとして使用します
(2) 複数のデータを挿入する
BookModel.insertMany([
{
title: "《水浒传》",
price: 15,
isHot: true
},
{
title: "《西游记》",
price: 20,
isHot: true
}
]).then((res) => {
console.log(res);
console.log("保存成功!");
})
(3) データを削除する
BookModel.deleteOne({ _id: "64c604fb363d6aa46652f368" }).then((res) => {
console.log(res);
console.log("删除成功!");
})
(4) 複数のデータを削除する
isHot が false の場合はすべて削除
BookModel.deleteMany({ isHot: false }).then((res) => {
console.log(res);
console.log("删除多个成功!");
})
(5)データ更新
パラメータ1:条件、パラメータ2の更新内容
BookModel.updateOne({ _id: "64c604fb363d6aa46652f362" },{price:99}).then((res) => {
console.log(res);
console.log("更新成功!");
})
(6) 複数のデータを更新する
BookModel.updateMany({ isHot: true, },{isHot:false}).then((res) => {
console.log(res);
console.log("更新多个成功!");
})
(7) あるデータを以下の条件で読み出す
BookModel.findOne({ _id: "64c604fb363d6aa46652f362" }).then((res) => {
console.log("读取成功!",res);
})
(8) idを元に特定のデータを読み込む
BookModel.findById("64c604fb363d6aa46652f362").then((res) => {
console.log("读取成功!",res);
})
(9) 複数データの読み込み
BookModel.find({ isHot: false, }).then((res) => {
console.log("读取多个成功!",res);
})
(10) クエリ条件に従って読み込む
一部の条件は > < = では判断できないため、相対的なコマンド記号が必要です。
- > $gt を使用する
- < $lt を使用
- >= $gte を使用する
- <= $lte を使用する
- !== $ne を使用します
運用上の判断の例をいくつか示します。
// 1.多个条件的查询 价格大于20 并且 isHot 为 false
BookModel.find({ price: { $gt: 20 }, isHot: false }).then((res) => {
console.log("价格大于20的", res);
})
// 2.多个条件的查询都要满足 价格大于20 或者 isHot 为 false
BookModel.find({ $and: [{ price: { $gt: 20 } }, { isHot: false }] }).then((res) => {
console.log("价格大于20的", res);
})
// 3.多个条件的查询满足一个 价格大于20 或者 isHot 为 false
BookModel.find({ $or: [{ price: { $gt: 20 } }, { isHot: true }] }).then((res) => {
console.log("价格大于20的", res);
})
// 4. 查询价格在 20 - 30 之间的数据
BookModel.find({ price: { $gte: 20, $lte: 30 } }).then((res) => {
console.log("价格大于20的", res);
})
// 5.正则查询
BookModel.find({ title: { $regex: /三国/ } }).then((res) => {
console.log("查询包含三国的", res);
})
(11) 個別の読書
検索後は、チェーン呼び出しを通じて後続の操作を実行することもできます。これも Promise によってカプセル化されています。
// 1.只读取出数据的某些字段
BookModel.find().select({title:1,price:1,_id:0}).then((res) => {
console.log("筛选结果", res);
})
// 2.排序 1 升序 -1 降序
BookModel.find().select({title:1,price:1,_id:0}).sort({price:1}).then((res) => {
console.log("筛选结果", res);
})
// 3.数据截取
BookModel.find().select({title:1,price:1,_id:0}).limit(2).then((res) => {
console.log("筛选结果", res);
})
// 4.截取3-4条
BookModel.find().select({title:1,price:1,_id:0}).skip(2).limit(2).then((res) => {
console.log("筛选结果", res);
})
(12) 共通業務の開発
// 登录
login: async ({ username, password }) => {
return UserModel.find({ username, password });
},
// 更新个人用户信息
updateUserInfo: async (info) => {
// 如果没有上传头像,就删除avatar字段 就不更新了
if (info.image == "") delete info.image;
return UserModel.updateOne({ _id: info.id }, info)
.then((res) => {
return UserModel.findOne({ _id: info.id });
})
.catch((err) => {
console.log("修改失败了", err);
});
},
// 获取用户列表
getUserList: async ({ pageSize = 10, pageNum = 1, keyword = "" }) => {
return {
code: 200,
msg: "获取成功",
data: {
pageNum: pageNum,
pageSize: pageSize,
total: await UserModel.find({
username: { $regex: keyword },
}).countDocuments(),
userList: await UserModel.find({ username: { $regex: keyword } })
.select("-password")
.skip((pageNum - 1) * pageSize)
.limit(pageSize),
},
};
},
// 添加用户
addUser: async (info) => {
return UserModel.find({ username: info.username }).then((res) => {
console.log("res", res);
if (res.length) {
return { code: 500, msg: "用户名已存在" };
} else {
UserModel.create(info);
return { code: 200, msg: "添加成功", data: { userInfo: info } };
}
});
},
// 删除用户
deleteUser: async (info) => {
return UserModel.deleteOne({ _id: info.id }).then((res) => {
console.log(res, "res");
if (res.deletedCount) {
return { code: 200, msg: "删除成功" };
} else {
return { code: 500, msg: "删除失败" };
}
});
},
// 更新用户信息
updateUser: async (info) => {
if (info.password == "") delete info.password;
return UserModel.updateOne({ _id: info._id }, info)
.then((res) => {
console.log(res, "res");
if (res.modifiedCount) {
return { code: 200, msg: "更新成功" };
} else {
return { code: 500, msg: "更新失败" };
}
})
.catch((err) => {
console.log(err);
});
}
5. グラフィカルな管理