MongoDB
記事ディレクトリ
1.基本的な紹介
コンセプト
MongoDBは、JSONドキュメントを格納する非リレーショナルデータベースです。構造は次のとおりです。
1つのデータベースには多くのコレクションがあり、1つのコレクションには多くのドキュメントがあります。
走る
DockerでMongoDBを実行します。
docker run --name mymongo -v /mymongo/data:/data/db -d mongo
# --name给容器起别名
MongoDBはデフォルトでポート27017を使用します
ログを表示する
docker logs 容器名称
モンゴシェル
Mongo Shellは、MongoDBを操作するためのJSクライアントです。
# 运行Mongo Shell
docker exec -it 容器名称 mongo
2.操作の追加、削除、変更、およびチェック
MongoDBに保存されている各ドキュメントには、ドキュメントの主キーと呼ばれる一意のIDがあり、次の_id
フィールド。
- 主キーは一意であり(異なるドキュメントの主キーを繰り返すことはできません)、配列を除くすべてのデータ型をサポートします。1つのドキュメントを別のドキュメントの主キーとして使用できます。これは複合主キーと呼ばれます。
- ドキュメントの作成時に主キーが指定されていない場合、デフォルトでオブジェクトの主キーが作成されます
ObjectId("包含创建时间的字串")
。- オブジェクトの主キーの作成時間を抽出します。
ObjectId("xxx").getTimestamp()
- オブジェクトの主キーの作成時間を抽出します。
2.1ドキュメントの作成
- 使用
db.集合.insert()
またはdb.集合.save()
コマンド- 挿入コマンドはさらにinsertOne、insertMany、insertに分けられます
基本構文:
db.<collection>.insertOne(
<document>,
{
writeConcern: <document>
}
)
<collection>
ドキュメントが保存されているコレクションに置き換えるために、このコレクションが存在しない場合は自動的に作成されます<document>
書かれた文書自体に置き換えられますwriteConcern: <document>
このドキュメント作成操作のセキュリティ書き込みレベルを定義します- 安全書き込みレベルは、データベース書き込み操作が成功したかどうかを判別するために使用されます。
- 安全な書き込みレベルが高いほど、データが失われるリスクは低くなりますが、書き込み操作の待ち時間は長くなります。
- 安全な書き込みレベルを指定しない場合、MongoDBはデフォルトレベルを使用します
- 注:ドキュメントの安全な書き込みレベルとJSONキーと値のペアは中括弧内にありません。別の中括弧を書き込む必要があります
デモ:
MongoShellを実行する
docker exec -it 容器名称 mongo
テストデータベースを使用する
use test
# 数据库存在则切换到该数据库,数据库不存在则自动创建该数据库并切换到该数据库
テストデータベースのすべてのコレクションを表示する
show collections
# 现在新创建的test数据库中还没有集合
アカウントコレクションにドキュメントを書き込む
db.accounts.insertOne(
{
_id: "account1",
name: "alice",
balance: 100
}
)
主キーが指定されていますが、安全な書き込みレベルが指定されていません
運転結果
{
"acknowledged" : true, "insertedId" : "account1" }
"acknowledged" : true
セキュア書き込みレベルが有効になっていることを示し、この時点でデフォルトのセキュア書き込みレベルのステータスが表示されます。"insertedId" : "account1"
書き込まれるドキュメントの主キーを表示します
insertOneでエラーが発生した場合
重複する主キーIDを使用して新しいドキュメントを作成します。
エラーが発生しました:
例外をキャッチできます:
ライブラリ関数printによって出力される例外メッセージは、より直感的です。
主キーIDを自動的に生成します
_id
フィールドを省略してください:
複数のドキュメントを作成する
基本構文:
- 順序付きパラメーターは、これらのドキュメントを順番に書き込むかどうかを決定するために使用されます。値はtrueまたはfalseで、デフォルト値はtrueです。
- 順序付けの値がfalseの場合、MongoDBはドキュメントの順序をシャッフルし、書き込みを高速化できます
例:
insertManyでエラーが発生した場合
- 順次書き込む場合、エラーが発生すると、正しいかどうかに関係なく、残りのドキュメントは実行されません。
- 順不同で書き込む場合、一部のドキュメントでエラーが発生した場合でも、残りの正しいドキュメントが書き込まれます。
複数または単一のドキュメントを作成する
基本構文:
例:
保存コマンド
基本構文:
- 保存命令が新しいドキュメントを処理するとき、挿入命令が呼び出されます
複合主キー
- 複合主キーも一意性を満たす必要があります。そうでない場合、エラーが報告されます
- 複合主キーの内容は同じですが、キーと値のペアの順序が異なり、主キーが重複しているとは見なされません。
2.2ドキュメントを読む
基本構文:
db.集合.find(<query>, <projection>)
query
クエリ条件をJSON形式(オプション)で示します。空の場合は、クエリ条件がないことを意味します。つまり、すべてのドキュメントがクエリされます。projection
結果の射影演算を表します(オプション)- 効率を向上させるために、ドキュメントの一部のフィールドを返すことができます(ドキュメントの一部を返さないことに注意してください)
- 投影されたフィールドが省略された場合、完全なフィールドに適格なすべてのドキュメントが返されます
- プロジェクションを使用するかどうかに関係なく、クエリ結果の数は同じですが、プロジェクションを使用すると、返されるドキュメントにすべてのフィールドが表示されなくなります。
2.2.1すべてのドキュメントを読む
db.集合.find()
ドキュメントをより直感的に表示します。db.集合.find().pretty()
2.2.2マッチングクエリ
2.2.3比較演算子
**注: **元々、クエリ条件はキー値が中括弧を共有することですが、コンパレータと値には別の中括弧が必要です。
例1:
注:$ne
クエリフィールドを含まないドキュメントはクエリされます。クエリフィールドを含まないことと同じではないことが理解できます。
例2:
比較演算子は、辞書式に比較することもできます。
例3:
知らせ:
- inおよびnin演算子に対応する値は、配列に配置する必要があります
- ninは、クエリフィールドを含まないドキュメントを除外します
例4:
inは正規表現と組み合わせて使用されます。
2.2.4論理演算子
**注: **論理演算子を使用するには、中括弧の追加レイヤーが必要です。
例1:
**注: **クエリフィールドを含まないドキュメントも除外されません。
例2:
簡略化された書き込み1(さまざまなフィールドで使用):
簡略化された書き込み2(同じフィールドで使用):
例3:
**注: **クエリフィールドを含まないドキュメントも除外されません。
2.2.5フィールド演算子
$exists
:指定されたフィールドを持つドキュメントがある場合に一致します
$type
:フィールドタイプがクエリ値と一致するドキュメントに一致します
例1:
例2:
元々、クエリフィールドを含まないドキュメントが取得されます。この条件を追加すると、クエリフィールドを含まないドキュメントはクエリされません。
例3:
例4:
2.2.6配列演算子
allExamples:
elemMatchの例:
2.3ドキュメントカーソル
実行すると、ドキュメントのコレクションのカーソルがdb.集合.find()
返されます。カーソルvar myCursor = db.集合.find()
を反復処理せずに、最初の20個のドキュメントのみが一覧表示されます。
カーソルの添え字を使用して、ドキュメントコレクション内のドキュメントに直接アクセスできます。
カーソル内のすべてのドキュメントを移動した後、または10分後に、カーソルは自動的に閉じます。
カーソル機能:
-
hasNext&next
-
forEach
-
制限してスキップ
注:
limit(0)
すべての結果が返されることを示します。 -
カウント
基本構文:
cursor.count(<boolean>)
、括弧が空の場合、デフォルトはfalseです。括弧がfalseの場合、limitとskipの両方が無効です。括弧がtrueの場合、limitとskipの効果が使用されます。
-
選別
1は小さいものから大きいものへの順方向のソートを意味し、-1は大きいものから小さいものへの逆方向のソートを意味します。
-
2つの注意点
- 制限前に実行をスキップ
- ソートはスキップして制限する前に実行されます
ドキュメントの投影:
ドキュメントプロジェクションを使用して、ドキュメントの一部のフィールドのみを返します。1は返す、0は返さない:
注:ドキュメントの主キーに加えて、投影操作の包含と除外の両方を使用することはできません。
2.4ドキュメントの更新
基本構文:
db.集合.update(<query>, <update>, <options>)
- queryは、更新されたドキュメントのフィルター条件を定義します。これは、findのフィルター条件と一致しています。
- updateは、更新結果を定義します
- optionsは、更新操作のいくつかのパラメーターを定義します
注:上記の3つはすべてオプションです。
例:
オプションの<update>に更新演算子が含まれていない場合、updateコマンドは、コレクション内の対応するドキュメント全体(すべてのフィールド)を<update>ドキュメントに直接置き換えます。
知らせ:
- 主キーフィールドは変更できません。主キーフィールドを使用する必要がある場合、<update>の主キーフィールドの値は元のコンテンツと一致している必要があります。
- 複数のドキュメントが<query>に一致する可能性がある場合、更新演算子なしで<update>を使用してドキュメント全体を更新すると、最初のドキュメントのみが更新されます。
更新演算子:
オプションの<update>に更新演算子が含まれている場合、updateコマンドは、コレクション内の対応するドキュメントの特定のフィールドを<update>ドキュメントに置き換えます。
$ set:
フィールドを更新または追加します。
配列のフィールドを更新します。
注:挿入が配列の範囲を超えて配列に空のスペースが生じる場合、デフォルトでは空のスペースはnullで埋められます。
$ unset:
フィールドの削除:
注:配列要素を削除しても、配列の長さは変更されませんが、対応する要素のみがnullに設定されます。
$ 名前の変更:
ドキュメントの名前を変更します。
-
存在しないドキュメントの名前を変更しても、元のドキュメントの内容は変更されません
-
新しいフィールド名がすでに存在する場合、元のドキュメントの同じ名前のフィールドは設定解除され、変更されるフィールドの名前が変更されます
-
インラインドキュメントの名前変更:
注:組み込みアレイの場合、この方法は使用できず、エラーが報告されます。
$ inc&$ mul:
知らせ:
- これらの2つのコマンドは、数値フィールドでのみ機能します
- 存在しないフィールドを操作すると、フィールド
$inc
が作成され、フィールド値が指定されたインクリメントまたはデクリメント値に設定されます。$mul
フィールドは作成されますが、フィールド値は0になります。
$ min&$ max:
元のドキュメント値を新しい値と比較した後、値を更新します。
注:更新されたフィールドが存在しない場合、これら2つのコマンドは、更新された値でフィールドを作成します。
配列更新演算子:
これらの演算子は、配列フィールドでのみ機能します。
$ addToSet:
知らせ:
-
挿入する値が配列フィールドにすでに存在する場合、このコマンドは重複する値を挿入しなくなります
-
このコマンドがドキュメントまたは配列を挿入する場合、同じ順序のコンテンツは重複しているとは見なされません。
-
一度に複数の値を追加します:
$ pop:
配列フィールドの最初または最後の要素を削除します。1は最後の要素を削除することを意味し、-1は最初の要素を削除することを意味します。
注:配列の最後の要素を削除すると、配列は空になります。
$ pull&$ pullAll:
配列フィールドから特定の要素を削除します。
$ push:
配列フィールドに要素を追加します。
2.5ドキュメントの削除
基本構文:
db.集合.remove(<query>, <options>)
- クエリ:クエリ条件
- フィルタ条件が空の場合は、すべてのドキュメントを削除することを意味します
- オプション:削除操作のパラメーター
デフォルトでは、このremove
コマンドはフィルター条件を満たすすべてのドキュメントを削除します。フィルター条件を満たす最初のドキュメントのみを削除する場合は、次のjustOne
パラメーター。
2.6コレクションの削除
remove
このコマンドは、コレクション内のすべてのドキュメントを削除できますが、コレクションは削除されません。コレクションを削除する方法は次のとおりです。