MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする方法
MongoDBで埋め込みドキュメントの配列に対してクエリを実行し、条件を満たす場合にのみ新しいドキュメントを追加したい場合は、updateメソッドと$push演算子を組み合わせて使用します。ここでは、実際のサンプルコードを使って手順を詳しく解説します。
手順1:サンプルコレクションの作成
まず、insertOne()メソッドを使って、埋め込みドキュメントの配列を含むドキュメントを作成しましょう。
> db.demo573.insertOne(
... {
... '_id' :101,
... 'SearchInformation' : [
... {
... 'Site' : 'Facebook.com',
... 'NumberOfHits' : 100
... },
... {
... 'Site' : 'Twitter.com',
... 'NumberOfHits' : 300
... }
... ]
... }
... );
{ "acknowledged" : true, "insertedId" : 101 }
手順2:作成したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo573.find();
このコマンドを実行すると、次のような出力が得られます。
{ "_id" : 101, "SearchInformation" : [ { "Site" : "Facebook.com", "NumberOfHits" : 100 }, { "Site" : "Twitter.com", "NumberOfHits" : 300 } ] }
手順3:updateと$pushで新しいドキュメントを追加
以下は、MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする例です。$nin演算子を組み合わせることで、「Google.com」がまだ配列内に存在しない場合にのみ追加処理が実行されるようになっています。
> db.demo573.update({
... _id: 101,
... "SearchInformation.Site": {
... $nin: ["Google.com"]
... }
... }, {
... $push: {
... "SearchInformation": {
... 'Site' : 'Google.com',
... 'NumberOfHits' : 10000
... }
... }
... });
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
手順4:更新結果の確認
再度find()メソッド(pretty()オプション付き)でドキュメントを表示して、更新内容を確認します。
> db.demo573.find().pretty();
実行すると、次のように配列の末尾に「Google.com」のドキュメントが正しく追加されていることがわかります。
{
"_id" : 101,
"SearchInformation" : [
{
"Site" : "Facebook.com",
"NumberOfHits" : 100
},
{
"Site" : "Twitter.com",
"NumberOfHits" : 300
},
{
"Site" : "Google.com",
"NumberOfHits" : 10000
}
]
}
ポイント解説
- $push演算子: 配列フィールドの末尾に指定した値(ドキュメント)を追加します。
- $nin演算子: フィールドの値が指定した配列内のどの値とも一致しない場合にマッチします。これにより、同じサイト名の重複登録を防止できます。
- WriteResultの確認: nMatchedは条件にマッチしたドキュメント数、nModifiedは実際に更新されたドキュメント数を示します。
なお、MongoDB 4.2以降ではdb.collection.update()は非推奨となっています。新規開発では、単一ドキュメントの更新にdb.collection.updateOne()、複数ドキュメントの更新にdb.collection.updateMany()を使用することが推奨されています。
-
$elemMatch演算子を使った配列フィールドを持つドキュメントの検索方法【MongoDB】
MongoDBで配列フィールド内の要素に基づいてドキュメントを検索したい場合、$elemMatch 演算子を使用します。$elemMatch を使うことで、配列内の同一の要素に対して複数の条件を同時に適用できるのが大きな特徴です。この記事では、実際にコレクションを作成し、配列フィールドを含むドキュメントを $elemMatch で照合する手順を解説します。1. テスト用コレクションの作成まず、配列フィールド details を持つドキュメントを挿入して、サンプルコレクションを作成しましょう。> db.demo592.insertOne( ... { ... id:1
-
MongoDBのaggregate()で3階層にネストされた埋め込みドキュメントの配列をフィルタリングする方法
MongoDBでネストされた配列をフィルタリングする基本アプローチMongoDBで3階層にネストされた埋め込みドキュメントの配列をフィルタリングするには、aggregate()メソッドを使用します。集計パイプラインの中で$unwindによって配列を展開し、$matchで条件に一致するドキュメントを絞り込むのが基本的な流れです。この記事では、実際のコード例を通じて具体的な手順を解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入してみましょう。> db.demo736.insertOne( ... { ... _id: