MongoDBで埋め込みドキュメント内のフィールドをインクリメントする方法
はじめに
MongoDBでは、$inc 演算子を使用することで、ドキュメント内の数値フィールドを簡単に増減させることができます。本記事では、ネスト(入れ子)された埋め込みドキュメントのフィールドに対して、$inc 演算子を使って値をインクリメントする手順を解説します。
ここでは、次のようなデータ構造を例にします。「StudentDetails」の中に「StudentScores」があり、さらにその中に各教科のスコアが格納されています。
... "StudentScores": {
... "StudentMathScore": 90,
... "StudentMongoDBScore": 78
... }サンプルコレクションの作成
まず、insertOne() メソッドを使って、サンプルドキュメントを含むコレクションを作成します。
> db.embeddedValueIncrementDemo.insertOne(
... {
... "StudentDetails": {
... "StudentScores": {
... "StudentMathScore": 90,
... "StudentMongoDBScore": 78
... }
... }
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5cd2b670345990cee87fd896")
}
登録済みドキュメントの確認
find() メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.embeddedValueIncrementDemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cd2b670345990cee87fd896"),
"StudentDetails" : {
"StudentScores" : {
"StudentMathScore" : 90,
"StudentMongoDBScore" : 78
}
}
}$inc演算子で埋め込みフィールドをインクリメントする
続いて、update() メソッドと $inc 演算子を組み合わせて、埋め込みフィールドの値を増やします。ここでは、「StudentMongoDBScore」を 20 増加させます。ポイントは、ドット記法(.)を使って「StudentDetails.StudentScores.StudentMongoDBScore」というように、ネストされたフィールドまでのパスを指定することです。
> db.embeddedValueIncrementDemo.update({ _id: new ObjectId("5cd2b670345990cee87fd896") }, { $inc: { "StudentDetails.StudentScores.StudentMongoDBScore": 20 } }, { upsert: true, safe: true }, null);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })実行結果を見ると、「nMatched」が 1 であることから条件に合致したドキュメントが1件存在し、「nModified」が 1 であることから実際に更新処理が行われたことがわかります。
更新結果の確認
もう一度すべてのドキュメントを表示して、値が正しく更新されているか確認しましょう。
> db.embeddedValueIncrementDemo.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5cd2b670345990cee87fd896"),
"StudentDetails" : {
"StudentScores" : {
"StudentMathScore" : 90,
"StudentMongoDBScore" : 98
}
}
}ご覧のとおり、「StudentMongoDBScore」の値が 78 から 98 へと正しくインクリメントされました。一方、「StudentMathScore」は 90 のまま変更されていません。$inc 演算子は指定したフィールドのみに作用するため、他のフィールドへ影響を与えることはありません。
まとめ
MongoDBで埋め込みドキュメントのフィールドをインクリメントするには、update() メソッド(または updateOne() / updateMany())と $inc 演算子を組み合わせます。ネストされたフィールドも、ドット記法でパスを指定するだけで自由に操作できます。なお、現在のMongoDBでは旧式の update() は非推奨となっているため、新規開発では updateOne() や updateMany() の利用が推奨される点にも注意しておきましょう。
-
【MongoDB】idがドキュメント内の配列フィールドの値と一致する場合に除外するクエリの書き方
MongoDBでは、ドキュメントの id フィールドの値が、同一ドキュメント内の配列型フィールド(例: subjectid)に含まれている場合に、そのドキュメントを検索結果から除外したいケースがあります。このような条件を実現するには、 $expr 演算子と組み合わせて $not および $in を使用します。本記事では、サンプルコレクションの作成からクエリの実行、出力結果の確認までを順を追って解説します。 サンプルコレクションの作成 まずは、動作確認用のドキュメントを含むコレクションを作成します。ここでは、 id フィールドと、文字列の配列を持つ subjectid フィールドを備えた2件のド
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: