MongoDBで配列内のサブアイテムを設定・更新する方法:位置演算子$の使い方
MongoDBでは、位置演算子(positional $ 演算子)を使用することで、配列内の特定のサブアイテム(要素)を簡単に更新できます。この記事では、実際のコード例を通じて、配列内のサブアイテムを設定・更新する手順を詳しく解説します。
サンプルコレクションの作成
まず、insertOne() メソッドを使って、ドキュメントを含むコレクションを作成します。ここでは、商品IDと複数の価格情報を持つ「ProductDetails」配列を含むドキュメントを作成します。
> db.demo22.insertOne(
... {
... ProductId:101,
... ProductDetails:
... [
... {
... ProductFirstPrice: '35',
... ProductSecondPrice: '75'
... },
... {
... ProductFirstPrice: '',
... ProductSecondPrice:''
... },
... {
... ProductFirstPrice: '78',
... ProductSecondPrice:'24'
... }
... ]
... }
... );
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c0b422d07d3b95082e70")
}
登録されたドキュメントの確認
find() メソッドを使用して、コレクション内のすべてのドキュメントを表示します。
> db.demo22.find().pretty();
これにより、次のような出力が得られます。
{
"_id" : ObjectId("5e14c0b422d07d3b95082e70"),
"ProductId" : 101,
"ProductDetails" : [
{
"ProductFirstPrice" : "35",
"ProductSecondPrice" : "75"
},
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : ""
},
{
"ProductFirstPrice" : "78",
"ProductSecondPrice" : "24"
}
]
}位置演算子 $ を使ったサブアイテムの更新クエリ
以下は、配列内のサブアイテムを設定するためのMongoDBクエリです。条件に一致する要素(ここでは ProductFirstPrice が "35" の要素)に対して、$set 演算子と組み合わせて $ 演算子を使用することで、該当する配列要素のみをピンポイントで更新できます。
> db.demo22.update({ "ProductDetails.ProductFirstPrice" : "35" },
... { $set : { "ProductDetails.$.ProductFirstPrice" : "" }}, false, true);
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })上記のクエリでは、第3引数の false はアップサート(upsert)を無効にし、第4引数の true はマルチアップデート(条件に一致するすべてのドキュメントを更新)を有効にしています。
更新結果の確認
再度 find() メソッドを実行して、更新後のドキュメントを確認します。
> db.demo22.find().pretty();
実行すると、次の出力が表示されます。
{
"_id" : ObjectId("5e14c0b422d07d3b95082e70"),
"ProductId" : 101,
"ProductDetails" : [
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : "75"
},
{
"ProductFirstPrice" : "",
"ProductSecondPrice" : ""
},
{
"ProductFirstPrice" : "78",
"ProductSecondPrice" : "24"
}
]
}まとめ
出力結果を見ると、最初の配列要素の ProductFirstPrice の値が "35" から "" に更新されていることがわかります。このように、位置演算子 $ を使えば、クエリ条件に一致した配列要素だけを効率的に更新することが可能です。なお、最新バージョンのMongoDBでは、非推奨となった update() メソッドの代わりに、updateOne() や updateMany() の使用が推奨されています。
-
MongoDBでネストされた配列をソートする方法:$unwindと$sortを活用したクエリ
MongoDBでドキュメント内に格納されたネストされた配列(サブドキュメントの配列)をソートしたい場合、集計パイプライン(aggregate)を使い、$unwindで配列を展開した後に$sortで並べ替え、最後に$groupで再構成するのが定番のアプローチです。この記事では、実際にコレクションを作成しながら、ネストされた配列をスコア順にソートする手順を解説します。1. サンプルコレクションの作成まず、ネストされた配列「details」を持つドキュメントを挿入してコレクションを作成します。> db.demo505.insertOne( ... { ... details: [ ..
-
MongoDBで配列内の一意(ユニーク)な要素を取得するには?distinct()メソッドの使い方
MongoDBで配列から一意(ユニーク)な要素を取得する方法 配列フィールドに含まれる重複した値を取り除き、一意な要素だけを抽出したい場合には、distinct()メソッドを使用します。この記事では、実際のコード例を通じて、その具体的な使い方をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使って、国名の配列を持つドキュメントをコレクションに挿入しましょう。 > db.demo588.insertOne({CountryName:[US,AUS,UK,US,UK,AUS]}); { acknowledged : true, ins