MongoDB
 Computer >> コンピューター >  >> プログラミング >> MongoDB

MongoDBでタグ(配列要素)を更新するクエリの書き方

MongoDBでタグを更新するには?

MongoDBでドキュメント内の配列に格納されたタグを更新するには、updateコマンド位置演算子「$」を組み合わせて使用します。この記事では、実際にコレクションを作成し、配列内の特定のタグを更新するまでの手順をサンプルコード付きで解説します。

1. コレクションの作成

まず、insertOne()メソッドを使って、タグ情報を持つドキュメントを含むコレクションを作成します。

> db.demo713.insertOne(
... {
... tags:
...     [
...       {
...           id:101,
...           Name:"Tag-1"
...       },
...       {
...           id:102,
...           Name:"Tag-3"
...       },
...       {
...           id:103,
...           Name:"Tag-3"
...       }
...     ]
... }
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5ea8625a5d33e20ed1097b87")
}

これで、「tags」という配列フィールドに3つのタグオブジェクトを持つドキュメントが登録されました。

2. 登録されたドキュメントの確認

find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。

> db.demo713.find();

実行すると、次のような出力が得られます。

{ "_id" : ObjectId("5ea8625a5d33e20ed1097b87"), "tags" : [ { "id" : 101, "Name" : "Tag-1" }, { "id" : 102, "Name" : "Tag-3" }, { "id" : 103, "Name" : "Tag-3" } ] }

ここで注目したいのは、idが102のタグのNameが誤って「Tag-3」になっている点です。これを「Tag-2」に修正してみましょう。

3. タグを更新するクエリ

以下が、配列内の特定のタグを更新するためのクエリです。

> db.demo713.update({"tags.id":102},{$set:{"tags.$.Name":"Tag-2"}},false,true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

このクエリのポイントは次のとおりです。

  • 検索条件「{"tags.id":102}」:配列内のidが102である要素を対象に指定します。
  • 位置演算子「$」:「tags.$.Name」と記述することで、検索条件に一致した配列要素だけをピンポイントで更新できます。
  • 第3引数のfalse:アップサート(該当ドキュメントが存在しない場合の新規作成)を無効にします。
  • 第4引数のtrue:条件に一致するすべてのドキュメントを更新対象にします(multiオプション)。

実行結果の「nModified : 1」は、1件のドキュメントが正常に更新されたことを示しています。

4. 更新結果の確認

再度find()メソッドにpretty()を組み合わせて実行し、更新後のドキュメントを整形して表示します。

> db.demo713.find().pretty();

実行すると、次のような出力が得られます。

{
    "_id" : ObjectId("5ea8625a5d33e20ed1097b87"),
    "tags" : [
       {
            "id" : 101,
            "Name" : "Tag-1"
       },
       {
            "id" : 102,
            "Name" : "Tag-2"
       },
       {
            "id" : 103,
            "Name" : "Tag-3"
       }
    ]
}

idが102のタグのNameが「Tag-3」から「Tag-2」に正しく更新されていることが確認できます。

補足:新しいバージョンではupdateOne()/updateMany()が推奨

MongoDB 4.2以降では、従来のupdate()は非推奨となり、代わりにupdateOne()updateMany()の使用が推奨されています。上記の処理は、次のように書き換えることができます。

> db.demo713.updateOne({"tags.id":102},{$set:{"tags.$.Name":"Tag-2"}});

updateOne()は最初に一致した1件のみ、updateMany()は一致したすべてのドキュメントを更新します。アップサートが必要な場合は、第3引数として「{ upsert: true }」などのオプションを渡せばOKです。位置演算子「$」の使い方は従来どおりなので、覚えておくと配列操作の幅が大きく広がります。

  1. MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順

    MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i

  2. 【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方

    MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...