如果是我,我能理解MongoDB
首先
这是我勉强整理的东西
※ 如果是我,我能理解。
MongoDB的概述
-
- ドキュメント思考
-
- NoSQL:データ構造決めずにデータ管理する(スキーマーレス)
- 公式Web
专业术语
-
- データーベース
-
- コレクション
RDBでいうテーブル
ドキュメント
RDBでいうレコード
オブジェクト形式 {field: val, field: val…}
データ構造関係なくオブジェクトを保管できる
环境搭建
想要营造一个环境
-
- Ubuntu 18.0.4 LTS
- その他の環境の方はこちらを参照
在本地使用
在本地进行环境设置
# パッケージ管理システムが使用する公開鍵をインポート
$ wget -qO-https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add-
# エラーが出た場合、必要なライブラリをインストール
$ sudo apt-get install gnupg
# バージョンのリストファイル作成
$ echo "deb [arch = amd64、arm64] https://repo.mongodb.org/apt/ubuntu bionic / mongodb-org / 4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
# ローカルパッケージのリロード
$ sudo apt-get update
# MongoDBのインストール
$ sudo apt-get install -y mongodb-org
# MongoDBの起動
$ sudo systemctl start mongod
# MongoDBの起動確認
$ sudo systemctl status mongod
# MongoDBを使ってみる
$ mongo
# ※ 再起動後も起動したい場合
$ sudo systemctl enable mongod
用的。
使用Docker和Docker Compose进行环境配置。
version: '3'
services:
# MongoDBのサービス
mongo:
image: mongo:latest
container_name: mongo
restart: always
environment:
MONGO_INITDB_ROOT_USERNAME: root
MONGO_INITDB_ROOT_PASSWORD: password
MONGODB_DATA_DIR: /data/db
ports:
- 27017:27017
volumes:
- ./db:/data/db
- ./configdb:/data/configdb
# MongoDBのGUIサービス
mongo-express:
image: mongo-express:latest
container_name: mongo-express
restart: always
links:
- mongo
ports:
- 8081:8081
environment:
ME_CONFIG_MONGODB_ADMINUSERNAME: root
ME_CONFIG_MONGODB_ADMINPASSWORD: password
尝试使用MongoDB
# コンテナへアクセス
$ docker-compose run --rm mongo bash
# MongoDBの対話モード
$ mongo admin -u root -p
パスワード入力(ymlファイルで設定した通りpasswordを入力)
命令 (Ming ling)
操作数据库
- データベース一覧
> show dbs;
- データベースの作成 or 切り替え
> use データベース名;
※ 在创建数据库时,由于还没有集合,所以它被认为是不存在的。
- データベースの削除
> db.dropDatabase();
- 現在のデータベースの状態
> db.stats();
可以查看当前选择的数据库的详细信息,例如名称等。
操作收藏
- コレクションの作成
> db.createCollection("コレクション名");
- コレクションの削除
<!DOCTYPE html>
<html lang="jp">
<head>
> db.コレクション名.drop();
- コレクション名の変更
> db.古いコレクション名.renameCollection("新しいコレクション名");
- コレクション一覧
> show collections;
操作文件
基本操纵
- ドキュメントの作成
> db.コレクション名.insert({
field: val,
field: val,
.
.
.
});
因为没有模式,可以在同一个集合中保存不同文档的结构。
- javascriptでドキュメントの作成
我正在学习中文。
> for (val i = 0; i < 10; i++) {
db.コレクション名.insert({
num: i
});
}
结果是以下文件被登记:
_id自动确定为唯一值。
{ "_id" : ObjectId("5e626f3ef980343ff158c2a0"), "num" : 0 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a1"), "num" : 1 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a2"), "num" : 2 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a3"), "num" : 3 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a4"), "num" : 4 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a5"), "num" : 5 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a6"), "num" : 6 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a7"), "num" : 7 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a8"), "num" : 8 }
{ "_id" : ObjectId("5e626f3ef980343ff158c2a9"), "num" : 9 }
- 全件削除
> db.コレクション名.remove({});
- 条件を指定して削除
> db.コレクション名.remove(条件);
以下是一个例子:
# idが1であるドキュメントの削除
> db.コレクション名.remove({id: 1})
表达
- 全件表示
> db.コレクション名.find();
- 表示したいフィールドの指定
只需提供一个选项,用中文将以下内容重新表达:将要显示在关键字段的名称为“key”,将“val”指定为true或1。
> db.コレクション名.find({field1: true, field2: 1, ...});
- 表示するフィールドの除外
在中文中,可以这样表达:
将要排除的字段名指定为key,并将val设为false或1。
> db.コレクション名.find({}, {field1: false, field2: 0, ...})
表达条件的调整
- 昇順にソート
> db.コレクション名.find({}).sort({field: 1})
- 降順にソート
> db.コレクション名.find({}).sort({field: -1})
- limit指定(表示する件数を指定)
> db.コレクション名.find({}).limit(数字)
- 先頭の行だけ表示
> db.コレクション名.findOne({})
- オフセット指定
> db.コレクション名.find({}).skip(数字)
指定的数字表示从头开始要跳过的行数,并显示数字之后的行。
展示指定文件
- 一致するドキュメントの表示
> db.コレクション名.find({field: val});
- 条件を指定したドキュメントの表示
> db.コレクション名.find({field: {条件: 数字}});
请关闭门。
请关上门。
> db.コレクション名.find({field: {$gte: 50}});
50以上のvalをもつドキュメントが表示される
条件列表
- 正規表現を使ったドキュメントの表示
> db.コレクション名.find({field: /正規表現/});
※ 可以使用 JavaScript 正则表达式
显示具有复杂条件的文档
- AND
> db.コレクション名.find({field1:条件, field2:条件,...});
- OR
> db.コレクション名.find({$or: [{field1:条件},{field2:条件},...]});
- IN
显示与指定字段中的[val1, val2, …]数组内的值匹配的文档。
> db.コレクション名.find({field: {$in: [val1, val2, ...]}});
- 指定したフィールドを持つドキュメントを表示
> db.コレクション名.find({field: {$exists: true}});
当将{$exists: false}设置为true时,将显示不具备指定字段的文档。
整个文档的信息
- 特定のフィールドの値を表示(射影)
> db.コレクション名.distinct(field);
- ドキュメント数のカウント
> db.コレクション名.count();
编辑文件
- フィールドの更新 or 追加
> db.コレクション名.update({field1: val1}, {$set: {field2: val2}});
field1和val1表示了筛选条件。
field2表示了要更新的字段,val2表示要更新的值。
如果不加上$set,注意会把它替换掉。
只对提取的第一条进行替换。
- 条件に一致するドキュメントが存在していれば更新、なければ作成
> db.コレクション名.update({field1: val1}, {field2: val2}, {upsert: true})
※ 与 $set 的不同之处在于它会更新与条件匹配的所有文档。
通过在第三个参数中指定{upsert: true},
- 条件に一致する全フィールドの更新
> db.コレクション名.update({field1: val1}, {$set: {field2: val2}}, {multi: true});
※需要修改的对象是集合中具有field1: val1的文档。
- 値を元に更新する場合
> db.コレクション名.update({field1: val1}, {$inc: {field2: val2}});
将原始值与val2相加并更新
- フィールドの名前を変更
> db.コレクション名.update({field1: val1}, {$rename: {field2: "new_field"}});
将field2的名称更改为new_field。
- フィールドの削除
> db.コレクション名.update({field1: val1}, {$unset: {field2: ""}});
删除field2
对索引进行操作
- メリット
通过在字段上创建索引,可以加快数据的搜索速度。
- デメリット
每次添加数据都需要分配适当的索引,反之可能导致效率低下。
显示索引
> db.コレクション名.getIndexes();
添加索引
# 昇順にインデックスを付与する場合
> db.コレクション名.createIndex({インデックス名: 1})
# 降順にインデックスを付与する場合
> db.コレクション名.createIndex({インデックス名: -1})
唯一标识的指定
通过指定索引为唯一,可以禁止数据重复。
只需一个选项:通过在索引中指定唯一性,可以防止数据重复。
> db.コレクション名.createIndex({インデックス名: 1}, {unique: true})
删除索引
# 昇順のインデックス
> db.コレクション名.dropIndex("インデックス名_1")
# 降順のインデックス
> db.コレクション名.dropIndex("インデックス名_-1")
如果忘记是按升序还是降序排列的话,可以通过getIndexes()来确认。
备份和恢复
备份
$ mongodump -d データベース名
当前目录将创建一个名为”dump”的文件夹。
复原 (fù
$ mongorestore --drop
添加“–drop”选项后,会删除现有的数据库并替换为备份。