MongoDBでネストされた配列内の値をインクリメントする方法
MongoDBでネストされた配列の中にある特定の値をインクリメント(加算)したい場合は、位置演算子($)を使用します。位置演算子は、クエリ条件に一致した配列要素を自動的に特定し、その要素に対してのみ更新操作を適用できる便利な機能です。
本記事では、実際にコレクションを作成しながら、ネストされた配列内の値をインクリメントする手順を順番に解説していきます。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使って、ドキュメントを含むコレクションを作成します。このドキュメントには「ProjectDetails」という配列フィールドがあり、その中に複数のプロジェクト情報がネストされています。
> db.incrementInNestedArrayDemo.insertOne(
... {
... "StudentId":100,
... "ProjectDetails":
... [
... {"ProjectId":567778888,
... "TeamSize":4
... },
... {
... "ProjectId":67888999,
... "TeamSize":2
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5c9a6b7b15e86fd1496b38aa")
}
上記のコレクションには、学生ID「100」のドキュメントが登録されており、2つのプロジェクト情報が配列として格納されています。
2. 登録したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.incrementInNestedArrayDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c9a6b7b15e86fd1496b38aa"),
"StudentId" : 100,
"ProjectDetails" : [
{
"ProjectId" : 567778888,
"TeamSize" : 4
},
{
"ProjectId" : 67888999,
"TeamSize" : 2
}
]
}
現時点では、「ProjectId: 67888999」のプロジェクトのチームサイズ(TeamSize)は「2」です。次に、この値をインクリメントしていきます。
3. ネストされた配列内の値をインクリメントする
ネストされた配列内の値をインクリメントするには、update()メソッドと$inc演算子、そして位置演算子($)を組み合わせて使用します。
> db.incrementInNestedArrayDemo.update({ "StudentId" : 100, "ProjectDetails.ProjectId":67888999} , {$inc:{"ProjectDetails.$.TeamSize":1}});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
このクエリのポイントは以下の3点です。
- 検索条件:「StudentId: 100」かつ「ProjectDetails.ProjectId: 67888999」という条件で、対象となるドキュメントと配列要素を絞り込みます。
- $inc演算子:指定したフィールドの値を、指定した数だけ増減させます。ここでは「1」を加算しています。
- 位置演算子($):クエリ条件に一致した配列要素を自動的に識別し、その要素の「TeamSize」フィールドのみを更新します。
実行結果の「nModified : 1」から、1件のドキュメントが正常に更新されたことがわかります。
4. 更新結果の確認
TeamSizeの値が正しく1増加しているかどうか、再度find()メソッドで確認してみましょう。
> db.incrementInNestedArrayDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5c9a6b7b15e86fd1496b38aa"),
"StudentId" : 100,
"ProjectDetails" : [
{
"ProjectId" : 567778888,
"TeamSize" : 4
},
{
"ProjectId" : 67888999,
"TeamSize" : 3
}
]
}
ご覧のとおり、「ProjectId: 67888999」のプロジェクトのTeamSizeが「2」から「3」に更新されました。一方、「ProjectId: 567778888」のTeamSizeは「4」のまま変更されていません。このように位置演算子($)を活用すれば、ネストされた配列の中から条件に一致する要素だけをピンポイントで更新することができます。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBで配列の値を使ってコレクションを並べ替える方法
MongoDBのコレクションを配列の値を基準にソートしたい場合は、aggregate()メソッドと $sort ステージを組み合わせて使用します。さらに、配列を個々のドキュメントに分解するために $unwind も活用します。 サンプルコレクションの作成 まず、ドキュメントを含むコレクションを作成しましょう。ここでは、学生ごとの詳細情報(名前とスコア)を配列として持つドキュメントを挿入します。 > db.demo577.insertOne( ... { ... student: { ... details: [ ... { .