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

MongoDBで$inc演算子に上限(制限)を設定する方法をわかりやすく解説

MongoDBの$inc演算子に制限をかけるには?

MongoDBの$inc演算子は、フィールドの値を指定した数だけ増加させる便利な更新演算子ですが、そのまま使うと値が無制限に増えてしまう可能性があります。そこで本記事では、update()メソッドと$lt演算子を組み合わせることで、$incによる値の増加に上限(しきい値)を設ける方法を、実際のコード例とともに詳しく解説します。

$incに制限を設定する基本構文

$incに上限を設定するには、以下のような構文を使用します。

db.yourCollectionName.update(
   { yourFieldName : { $lt : yourValue } },
   { $inc : { yourFieldName : yourIncrementValue } },
   false,
   true
);

この構文のポイントは以下の通りです。

  • 第1引数(クエリ条件):$lt演算子を使い、「フィールドの値が指定したしきい値より小さいドキュメント」のみを対象にします。これにより、しきい値以上のドキュメントは更新されず、結果として上限が実現されます。
  • 第2引数(更新内容):$inc演算子でフィールドの値を増加させます。
  • 第3引数(upsert):falseを指定し、条件に一致するドキュメントが存在しない場合でも新規作成を行いません。
  • 第4引数(multi):trueを指定することで、条件に一致したすべてのドキュメントを一括更新します。

サンプルコレクションの作成

それでは、実際に動作を確認してみましょう。まず、学生のスコアデータを含むコレクションを作成します。

> db.limitIncrementDemo.insertOne({"StudentId":101,"StudentScore":95});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd2ce9eb64f4b851c3a13c3")
}
> db.limitIncrementDemo.insertOne({"StudentId":102,"StudentScore":55});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd2cea0b64f4b851c3a13c4")
}
> db.limitIncrementDemo.insertOne({"StudentId":103,"StudentScore":67});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd2cea1b64f4b851c3a13c5")
}
> db.limitIncrementDemo.insertOne({"StudentId":104,"StudentScore":56});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd2cea3b64f4b851c3a13c6")
}
> db.limitIncrementDemo.insertOne({"StudentId":105,"StudentScore":79});
{
    "acknowledged" : true,
    "insertedId" : ObjectId("5cd2cea4b64f4b851c3a13c7")
}

5件のドキュメントを作成しました。各ドキュメントは「StudentId(学生ID)」と「StudentScore(スコア)」を持っています。

登録データの確認

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

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

実行すると、以下の出力が得られます。

{
    "_id" : ObjectId("5cd2ce9eb64f4b851c3a13c3"),
    "StudentId" : 101,
    "StudentScore" : 95
}
{
    "_id" : ObjectId("5cd2cea0b64f4b851c3a13c4"),
    "StudentId" : 102,
    "StudentScore" : 55
}
{
    "_id" : ObjectId("5cd2cea1b64f4b851c3a13c5"),
    "StudentId" : 103,
    "StudentScore" : 67
}
{
    "_id" : ObjectId("5cd2cea3b64f4b851c3a13c6"),
    "StudentId" : 104,
    "StudentScore" : 56
}
{
    "_id" : ObjectId("5cd2cea4b64f4b851c3a13c7"),
    "StudentId" : 105,
    "StudentScore" : 79
}

$incに上限75を設定してスコアを10加算する

ここからが本題です。「StudentScoreが75未満のドキュメントに対してのみ、スコアを10加算する」という条件付き更新を実行します。

> db.limitIncrementDemo.update({StudentScore : {$lt : 75}}, {$inc : {StudentScore : 10}},false,true);
WriteResult({ "nMatched" : 3, "nUpserted" : 0, "nModified" : 3 })

実行結果を見ると、「nMatched: 3」「nModified: 3」と表示されており、条件(75未満)に一致した3件のドキュメントだけが更新されたことがわかります。スコアが95と79のドキュメントは、すでにしきい値以上のため更新対象外となりました。

更新後のデータ確認

再度find()メソッドで全ドキュメントを確認しましょう。

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

出力結果は以下の通りです。

{
    "_id" : ObjectId("5cd2ce9eb64f4b851c3a13c3"),
    "StudentId" : 101,
    "StudentScore" : 95
}
{
    "_id" : ObjectId("5cd2cea0b64f4b851c3a13c4"),
    "StudentId" : 102,
    "StudentScore" : 65
}
{
    "_id" : ObjectId("5cd2cea1b64f4b851c3a13c5"),
    "StudentId" : 103,
    "StudentScore" : 77
}
{
    "_id" : ObjectId("5cd2cea3b64f4b851c3a13c6"),
    "StudentId" : 104,
    "StudentScore" : 66
}
{
    "_id" : ObjectId("5cd2cea4b64f4b851c3a13c7"),
    "StudentId" : 105,
    "StudentScore" : 79
}

結果のポイント

更新前後を比較すると、以下の変化があったことが確認できます。

  • StudentId 102:55 → 65(+10 加算)
  • StudentId 103:67 → 77(+10 加算)
  • StudentId 104:56 → 66(+10 加算)
  • StudentId 101:95 → 95(変更なし・しきい値以上のため)
  • StudentId 105:79 → 79(変更なし・しきい値以上のため)

このように、クエリ条件に$lt演算子を組み込むだけで、$incによる無制限な増加を防ぎ、実質的な「上限付きインクリメント」を実現できます。

補足:新しい構文について

なお、上記の例では従来のupdate()メソッドを使用していますが、MongoDB 4.2以降ではupdateMany()メソッドを使うのが推奨されています。同じ処理は以下のように書き換えられます。

db.limitIncrementDemo.updateMany(
   { StudentScore : { $lt : 75 } },
   { $inc : { StudentScore : 10 } }
);

updateMany()ではmultiオプションを明示的に指定する必要がなく、コードもより簡潔になります。また、より厳密に「加算後にしきい値を超えないようにしたい」ケースでは、集計パイプライン(aggregation pipeline)を使った更新や、アプリケーション側での事前チェックと組み合わせる方法も検討するとよいでしょう。

  1. MongoDBでコンソールをクリアする2つの方法|ショートカット「Ctrl + L」とコマンド「cls」の使い方

    MongoDBのシェル(mongo / mongosh)を使っていると、実行したクエリや結果がどんどん積み重なり、画面が見づらくなることがあります。そんなときに便利なのがコンソールのクリア機能です。MongoDBでは、以下の2つの方法でコンソールをクリアできます。 方法1:キーボードショートカット「Ctrl + L」を使う 最も手軽なのが、キーボードショートカットを使う方法です。次のキーを押すだけで、即座にコンソールをクリアできます。 Ctrl + L このキーを押すと、それまで表示されていたログや実行結果がすべて消え、まっさらな状態になります。Linuxのターミナルなどと同じ操作感なので、

  2. Androidでデータ使用制限を設定する方法|通信量オーバーを防ぐ手順を解説

    Androidスマートフォンでモバイルデータの使用制限(上限)を設定したいと思ったことはありませんか?契約プランが使い放題(無制限)でない場合、アプリやサービスの通信を制限しないままでは、データ使用量の管理はなかなか難しいものです。仕事でインターネットが必要な方にとっては、モバイルデータなしで過ごすのはさらに大変でしょう。それでも、月間のデータ残量を使い切ってしまったときには、何らかの対策を取らざるを得ません。多くの通信キャリアでは、規定量をわずかに超えただけでも高額な追加料金が請求されることがあります。そこで本記事では、Android端末でデータ使用制限を設定する方法をご紹介します。事前に上