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

MongoDBで$pullと$addToSetを同時に実行する方法を解説

MongoDBで$pullと$addToSetを同時に実行することは可能?

はい、可能です。MongoDBでは$addToSet演算子と$pull演算子を組み合わせることで、配列への要素の追加と削除を同時に行うことができます。これを実現するには、順序付きバルク操作(initializeOrderedBulkOp())を利用します。

まず、サンプルとなるコレクションをドキュメント付きで作成しましょう。

> db.pullAndAddToSetDemo.insertOne({StudentScores : [78, 89, 90]}
... );
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5c9a797e15e86fd1496b38af")
}

作成したドキュメントの確認

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

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

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

{
    "_id" : ObjectId("5c9a797e15e86fd1496b38af"),
    "StudentScores" : [
        78,
        89,
        90
    ]
}

$pullと$addToSetを同時に実行するクエリ

続いて、本題である$pullと$addToSetの同時実行を見ていきましょう。ポイントは、バルク操作オブジェクトを作成し、複数の更新操作をまとめてexecute()で実行するところです。

> var addAndPull = db.pullAndAddToSetDemo.initializeOrderedBulkOp();
> addAndPull.find({ "StudentScores": 89 }).updateOne({ "$addToSet": { "StudentScores": 99 } });
> addAndPull.find({ "StudentScores": 90 }).updateOne({ "$pull": { "StudentScores": 90 } });
> addAndPull.execute();

このクエリでは、配列に値「89」が存在する場合に新しい値「99」を追加し($addToSet)、同時に値「90」を配列から削除しています($pull)。実行すると、次のような結果が出力されます。

BulkWriteResult({
    "writeErrors" : [ ],
    "writeConcernErrors" : [ ],
    "nInserted" : 0,
   "nUpserted" : 0,
    "nMatched" : 2,
    "nModified" : 2,
    "nRemoved" : 0,
    "upserted" : [ ]
})

結果の「nMatched: 2」「nModified: 2」は、2つの更新操作がそれぞれドキュメントにマッチし、正常に適用されたことを示しています。

更新後のドキュメントを再確認

最後に、もう一度コレクションの内容を確認してみましょう。

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

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

{
    "_id" : ObjectId("5c9a797e15e86fd1496b38af"),
    "StudentScores" : [
        78,
        89,
        99
    ]
}

出力を見ると、配列から「90」が削除され、代わりに「99」が追加されていることが確認できます。このようにバルク操作を活用すれば、$pullと$addToSetを1回のexecute()で効率的に実行でき、配列の柔軟な更新が可能になります。

  1. C++で棒の長さから作れる長方形と正方形の個数を求める方法

    問題の概要 この問題では、N本の棒の長さを表す整数の配列が与えられます。これらの棒を選んで作ることができる「長方形」と「正方形」の合計個数を求めて出力するのが課題です。 具体例で問題を確認してみましょう。 入力: array = {5, 5, 7, 7, 1, 4} 出力: 1 説明: 長さ 5, 5, 7, 7 の4本を選ぶことで、1つの長方形を作ることができます。 解き方のポイント 長方形も正方形も、向かい合う辺が同じ長さである図形です。そのため、同じ長さの棒が「2本ずつのペア」になっている必要があり、どちらの図形を作る場合でも必要なのは同じ長さのペア2組(計4本)です。 そこで、以下の手

  2. Redis SADDコマンドの使い方 – セットに要素を作成して追加する方法

    このチュートリアルでは、redis-cliでSADDコマンドを使用して、キーに保存されたセット(Set)型の値に要素を作成・追加する方法を解説します。 SADDコマンドを実行すると、指定したキーがデータストア内にすでに存在する場合は、そのセットに新しい要素が追加されます(すでに存在している要素は自動的に無視されます)。一方、キーがまだ存在しない場合は、要素を追加する前に新しいセットが自動的に作成されます。 SADDコマンドの構文 redis host:port> SADD <keyname> <value1> [<value2>] 値をスペースで区切