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

MongoDBでブール値をトグル(反転)するクエリの実装方法

MongoDBでブール値をトグル(反転)するクエリの実装方法

MongoDBでtrue/falseのようなブール値フィールドを反転させたい場合は、まずfindOne()で対象ドキュメントの現在の値を取得し、その後update()を使って値を書き戻すという2段階の手順が必要です。本記事では、実際のコード例を使ってトグルクエリの実装方法をわかりやすく解説します。

ステップ1:サンプルコレクションの作成

まず、ドキュメントを格納するコレクションを作成します。

> db.toggleDemo.insertOne({"CustomerName":"John Smith","CustomerAge":28,"isMarried":true});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7be138f9e6ff3eb0ce43b")
}
> db.toggleDemo.insertOne({"CustomerName":"David Miller","CustomerAge":25,"isMarried":false});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c")
}

ステップ2:登録済みドキュメントの確認

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

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

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

{
    "_id" : ObjectId("5cc7be138f9e6ff3eb0ce43b"),
    "CustomerName" : "John Smith",
    "CustomerAge" : 28,
    "isMarried" : true
}
{
    "_id" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c"),
    "CustomerName" : "David Miller",
    "CustomerAge" : 25,
    "isMarried" : false
}

ステップ3:トグルクエリの実行

続いて、MongoDBでトグルクエリを実行します。ポイントは、findOne()で現在の値を変数に取得し、論理NOT演算子(!)で反転した値を$set演算子で更新することです。

> var value = db.toggleDemo.findOne({CustomerName:"David Miller"});
> db.toggleDemo.update({CustomerName:"David Miller"}, {$set: {isMarried: !value.isMarried}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })

ステップ4:更新結果の確認

isMarriedがfalseだったドキュメントがtrueに反転しているかどうか、もう一度すべてのドキュメントを表示して確認しましょう。

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

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

{
    "_id" : ObjectId("5cc7be138f9e6ff3eb0ce43b"),
    "CustomerName" : "John Smith",
    "CustomerAge" : 28,
    "isMarried" : true
}
{
    "_id" : ObjectId("5cc7be2e8f9e6ff3eb0ce43c"),
    "CustomerName" : "David Miller",
    "CustomerAge" : 25,
    "isMarried" : true
}

このように、「David Miller」のisMarriedフィールドがfalseからtrueへ正しくトグルされていることが確認できます。

補足:新しいバージョンのMongoDBでの注意点

MongoDB 5.0以降では、update()メソッドは非推奨となっており、代わりにupdateOne()updateMany()の使用が推奨されています。また、MongoDB 4.2以降では集計パイプライン形式の更新も利用できるため、次のように書けばサーバー側だけでトグル処理を完結させることができます。

> db.toggleDemo.updateOne(
  { CustomerName: "David Miller" },
  [ { $set: { isMarried: { $not: "$isMarried" } } } ]
);

用途やバージョンに応じて、これらの方法を使い分けるとよいでしょう。

  1. MongoDBでコレクションの名前を変更する方法(renameCollectionの使い方)

    MongoDBで既存のコレクションの名前を変更したい場合、renameCollection()メソッドを使用します。この記事では、実際にコレクションを作成し、その名前を変更するまでの手順を順番に解説します。1. ドキュメントを含むコレクションを作成するまず、insertOne()メソッドを使ってサンプルドキュメントを挿入し、コレクション「demo690」を作成します。> db.demo690.insertOne({_id:101,Name:Sam}); { acknowledged : true, insertedId : 101 } > db.demo690.insertOne(

  2. MongoDBで埋め込みドキュメント(配列内のサブドキュメント)をクエリする方法

    MongoDBの埋め込みドキュメントをクエリするには?MongoDBでは、ドキュメントの中に配列として埋め込まれたサブドキュメントをクエリする場合、aggregate()メソッドを使用するのが効果的です。この記事では、$unwindと$matchを組み合わせて、埋め込みドキュメントから条件に合うデータを抽出する手順を解説します。1. サンプルコレクションの作成まずは、学生情報を配列として持つドキュメントを含むコレクションを作成しましょう。insertOne()メソッドを使ってドキュメントを挿入します。> db.demo705.insertOne( ... { ...