MongoDBおよびCRUD操作の使用

MongoDB

1.基本的な紹介

コンセプト

MongoDBは、JSONドキュメントを格納する非リレーショナルデータベースです。構造は次のとおりです。

画像-20211030224316478

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を使用して新しいドキュメントを作成します。

画像-20211031002028387

エラーが発生しました:

画像-20211031002210468

例外をキャッチできます:

画像-20211031002247779

ライブラリ関数printによって出力される例外メッセージは、より直感的です。

画像-20211031002401481

主キーIDを自動的に生成します

_idフィールドを省略してください:

画像-20211031002536190

複数のドキュメントを作成する

基本構文:

画像-20211031002610211
  • 順序付きパラメーターは、これらのドキュメントを順番に書き込むかどうかを決定するために使用されます。値はtrueまたはfalseで、デフォルト値はtrueです。
  • 順序付けの値がfalseの場合、MongoDBはドキュメントの順序をシャッフルし、書き込みを高速化できます

例:

画像-20211031003020892

insertManyでエラーが発生した場合

画像-20211031003257326
  • 順次書き込む場合、エラーが発生すると、正しいかどうかに関係なく、残りのドキュメントは実行されません。
  • 順不同で書き込む場合、一部のドキュメントでエラーが発生した場合でも、残りの正しいドキュメントが書き込まれます。

複数または単一のドキュメントを作成する

基本構文:

画像-20211031003551219

例:

画像-20211031003622946

保存コマンド

基本構文:

画像-20211031003702958
  • 保存命令が新しいドキュメントを処理するとき、挿入命令が呼び出されます

複合主キー

画像-20211031004104293
  • 複合主キーも一意性を満たす必要があります。そうでない場合、エラーが報告されます
    • 複合主キーの内容は同じですが、キーと値のペアの順序が異なり、主キーが重複しているとは見なされません。

2.2ドキュメントを読む

基本構文:

db.集合.find(<query>, <projection>)

  • queryクエリ条件をJSON形式(オプション)で示します。空の場合は、クエリ条件がないことを意味します。つまり、すべてのドキュメントがクエリされます。
  • projection結果の射影演算を表します(オプション)
    • 効率を向上させるために、ドキュメントの一部のフィールドを返すことができます(ドキュメントの一部を返さないことに注意してください)
    • 投影されたフィールドが省略された場合、完全なフィールドに適格なすべてのドキュメントが返されます
    • プロジェクションを使用するかどうかに関係なく、クエリ結果の数は同じですが、プロジェクションを使用すると、返されるドキュメントにすべてのフィールドが表示されなくなります。

2.2.1すべてのドキュメントを読む

db.集合.find()

ドキュメントをより直感的に表示します。db.集合.find().pretty()

2.2.2マッチングクエリ

画像-20211031101911250 画像-20211031102319210

2.2.3比較演算子

画像-20211031102433257 画像-20211031141542785

**注: **元々、クエリ条件はキー値が中括弧を共有することですが、コンパレータと値には別の中括弧が必要です。

例1:

画像-20211031102527757

注:$neクエリフィールドを含まないドキュメントはクエリされます。クエリフィールドを含まないことと同じではないことが理解できます。

例2:

比較演算子は、辞書式に比較することもできます。

画像-20211031141508493

例3:

画像-20211102205501853

知らせ:

  1. inおよびnin演算子に対応する値は、配列に配置する必要があります
  2. ninは、クエリフィールドを含まないドキュメントを除外します

例4:

inは正規表現と組み合わせて使用​​されます。

画像-20211115214303522

2.2.4論理演算子

画像-20211102205732190

**注: **論理演算子を使用するには、中括弧の追加レイヤーが必要です。

例1:

画像-20211102205856227

**注: **クエリフィールドを含まないドキュメントも除外されません。

例2:

画像-20211102210014928

簡略化された書き込み1(さまざまなフィールドで使用):

画像-20211102210237250

簡略化された書き込み2(同じフィールドで使用):

画像-20211102210314660

例3:

画像-20211102210425505

**注: **クエリフィールドを含まないドキュメントも除外されません。

2.2.5フィールド演算子

$exists:指定されたフィールドを持つドキュメントがある場合に一致します

$type:フィールドタイプがクエリ値と一致するドキュメントに一致します

例1:

画像-20211102210642158

例2:

元々、クエリフィールドを含まないドキュメントが取得されます。この条件を追加すると、クエリフィールドを含まないドキュメントはクエリされません。

画像-20211102210746866

例3:

画像-20211102210939164

例4:

画像-20211102211005913

2.2.6配列演算子

画像-20211115213031171

allExamples:

画像-20211115213648847

elemMatchの例:

画像-20211115213922603

2.3ドキュメントカーソル

実行すると、ドキュメントのコレクションのカーソルがdb.集合.find()返されます。カーソルvar myCursor = db.集合.find()を反復処理せずに、最初の20個のドキュメントのみが一覧表示されます。

カーソルの添え字を使用して、ドキュメントコレクション内のドキュメントに直接アクセスできます。

画像-20211115214721234

カーソル内のすべてのドキュメントを移動した後、または10分後に、カーソルは自動的に閉じます。

画像-20211115214828765

カーソル機能:

  1. hasNext&next

    画像-20211115214942657
  2. forEach

    画像-20211115214954606
  3. 制限してスキップ

    画像-20211115215229209

    注:limit(0)すべての結果が返されることを示します。

  4. カウント

    基本構文:cursor.count(<boolean>)、括弧が空の場合、デフォルトはfalseです。

    括弧がfalseの場合、limitとskipの両方が無効です。括弧がtrueの場合、limitとskipの効果が使用されます。

    画像-20211116211525122
  5. 選別

    1は小さいものから大きいものへの順方向のソートを意味し、-1は大きいものから小さいものへの逆方向のソートを意味します。

    画像-20211116211644258
  6. 2つの注意

    • 制限前に実行をスキップ
    • ソートはスキップして制限する前に実行されます
    画像-20211116211923609

ドキュメントの投影:

ドキュメントプロジェクションを使用して、ドキュメントの一部のフィールドのみを返します。1は返す、0は返さない:

画像-20211116213311315

注:ドキュメントの主キーに加えて、投影操作の包含と除外の両方を使用することはできません。

画像-20211116213746785

2.4ドキュメントの更新

基本構文:

db.集合.update(<query>, <update>, <options>)

  • queryは、更新されたドキュメントのフィルター条件を定義します。これは、findのフィルター条件と一致しています。
  • updateは、更新結果を定義します
  • optionsは、更新操作のいくつかのパラメーターを定義します

注:上記の3つはすべてオプションです。

例:

オプションの<update>に更新演算子が含まれていない場合、updateコマンドは、コレクション内の対応するドキュメント全体(すべてのフィールド)を<update>ドキュメントに直接置き換えます。

画像-20211116221939312

知らせ:

  1. 主キーフィールドは変更できません。主キーフィールドを使用する必要がある場合、<update>の主キーフィールドの値は元のコンテンツと一致している必要があります。
  2. 複数のドキュメントが<query>に一致する可能性がある場合、更新演算子なしで<update>を使用してドキュメント全体を更新すると、最初のドキュメントのみが更新されます。

更新演算子:

オプションの<update>に更新演算子が含まれている場合、updateコマンドは、コレクション内の対応するドキュメントの特定のフィールドを<update>ドキュメントに置き換えます。

画像-20211116222411862

$ set:

フィールドを更新または追加します。

画像-20211117171504119

配列のフィールドを更新します。

画像-20211117171742325

注:挿入が配列の範囲を超えて配列に空のスペースが生じる場合、デフォルトでは空のスペースはnullで埋められます。

$ unset:

フィールドの削除:

画像-20211117172341362

注:配列要素を削除しても、配列の長さは変更されませんが、対応する要素のみがnullに設定されます。

$ 名前の変更:

ドキュメントの名前を変更します。

画像-20211117173038137
  1. 存在しないドキュメントの名前を変更しても、元のドキュメントの内容は変更されません

  2. 新しいフィールド名がすでに存在する場合、元のドキュメントの同じ名前のフィールドは設定解除され、変更されるフィールドの名前が変更されます

  3. インラインドキュメントの名前変更:

    画像-20211117173752956

    注:組み込みアレイの場合、この方法は使用できず、エラーが報告されます。

$ inc&$ mul:

画像-20211117174144585 画像-20211117174208498

知らせ:

  1. これらの2つのコマンドは、数値フィールドでのみ機能します
  2. 存在しないフィールドを操作すると、フィールド$incが作成され、フィールド値が指定されたインクリメントまたはデクリメント値に設定されます。$mulフィールドは作成されますが、フィールド値は0になります。

$ min&$ max:

元のドキュメント値を新しい値と比較した後、値を更新します。

画像-20211117175326205

注:更新されたフィールドが存在しない場合、これら2つのコマンドは、更新された値でフィールドを作成します。

配列更新演算子:

これらの演算子は、配列フィールドでのみ機能します。

画像-20211117175840513

$ addToSet:

画像-20211117180116819

知らせ:

  1. 挿入する値が配列フィールドにすでに存在する場合、このコマンドは重複する値を挿入しなくなります

  2. このコマンドがドキュメントまたは配列を挿入する場合、同じ順序のコンテンツは重複しているとは見なされません。

  3. 一度に複数の値を追加します:

    画像-20211117180533783 画像-20211117180606440

$ pop:

配列フィールドの最初または最後の要素を削除します。1は最後の要素を削除することを意味し、-1は最初の要素を削除することを意味します。

画像-20211117211436683

注:配列の最後の要素を削除すると、配列は空になります。

$ pull&$ pullAll:

配列フィールドから特定の要素を削除します。

画像-20211117212353876 画像-20211117212447740

$ push:

配列フィールドに要素を追加します。

画像-20211117212546401

2.5ドキュメントの削除

基本構文:

db.集合.remove(<query>, <options>)

  • クエリ:クエリ条件
    • フィルタ条件が空の場合は、すべてのドキュメントを削除することを意味します
  • オプション:削除操作のパラメーター
画像-20211117212755912

デフォルトでは、このremoveコマンドはフィルター条件を満たすすべてのドキュメントを削除します。フィルター条件を満たす最初のドキュメントのみを削除する場合は、次のjustOneパラメーター。

画像-20211117213023249

2.6コレクションの削除

removeこのコマンドは、コレクション内のすべてのドキュメントを削除できますが、コレクションは削除されません。コレクションを削除する方法は次のとおりです。

画像-20211117213123837

おすすめ

転載: blog.csdn.net/weixin_49343190/article/details/121388500