【MongoDB】特定の要素を別の配列へ移動させる方法
MongoDBで、配列内の条件に一致する要素を別の配列へ移動させたい場合は、forEach()で各ドキュメントを走査し、条件に合う要素を判定した上でsave()を使って更新します。この記事では、実際のコード例と実行結果をもとに、その手順をわかりやすく解説します。
1. サンプルコレクションの作成
まず、テスト用のドキュメントを含むコレクションを作成しましょう。ここでは「Information」配列と空の「different」配列を持つドキュメントを挿入します。
> db.demo646.insertOne(
... {
... "Information": [
... { id: 100, Name:"Chris" },
... { id: 100, Name:"Chris" },
... { id: 101, Name:"David" },
... { id: 100, Name:"Chris" }
... ],
... "different": []
... }
... )
{
"acknowledged" : true,
"insertedId" : ObjectId("5e9c82ec6c954c74be91e6ed")
}2. 挿入したドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo646.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5e9c82ec6c954c74be91e6ed"),
"Information" : [
{
"id" : 100,
"Name" : "Chris"
},
{
"id" : 100,
"Name" : "Chris"
},
{
"id" : 101,
"Name" : "David"
},
{
"id" : 100,
"Name" : "Chris"
}
],
"different" : [ ]
}3. 要素を別の配列へ移動するクエリ
それでは、「id」が101の要素を「Information」配列から「different」配列へ移動させてみます。forEach()で各ドキュメントを取得し、JavaScriptのfilter()メソッドを使って要素を振り分けた後、save()でドキュメントを保存します。
> db.demo646.find({}).forEach(function(d) {
... d.different = d.Information.filter(function(v) { return v.id == 101 })
... d.Information = d.Information.filter(function(v) { return v.id != 101 })
... db.demo646.save(d)
... }
... )このクエリでは、まずv.id == 101の条件に一致する要素を「different」配列に格納し、次にv.id != 101の条件で残りの要素だけを「Information」配列に残しています。
4. 移動後の結果を確認
もう一度find()メソッドを実行して、結果を確認しましょう。
> db.demo646.find().pretty();
実行結果は以下の通りです。
{
"_id" : ObjectId("5e9c82ec6c954c74be91e6ed"),
"Information" : [
{
"id" : 100,
"Name" : "Chris"
},
{
"id" : 100,
"Name" : "Chris"
},
{
"id" : 100,
"Name" : "Chris"
}
],
"different" : [
{
"id" : 101,
"Name" : "David"
}
]
}このように、「id:101」のドキュメント(David)が「different」配列へ移動し、「Information」配列には該当しない要素のみが残っていることが確認できます。
まとめ
MongoDBで配列間の要素移動を行うには、forEach()でドキュメントを走査し、JavaScriptのfilter()で条件に応じて要素を振り分け、save()で更新するのが基本的なアプローチです。条件部分を変更すれば、任意の基準で要素を別の配列へ移動させることが可能です。
-
【MongoDB】aggregate()と$groupで異なるドキュメント内の同じIDを持つ要素を集約する方法
複数のドキュメントにまたがって同じIDを持つ要素をグループ化したい場合には、MongoDBの aggregate() メソッドと $group ステージを組み合わせるのが効果的です。本記事では、実際にサンプルコレクションを作成しながら、IDごとにドキュメントを集約する手順をわかりやすく解説します。1. サンプルコレクションの作成まずは動作確認用のコレクションを作成し、ドキュメントを挿入していきます。ここでは「id」と「Name」というフィールドを持つドキュメントを6件登録します。> db.demo602.insertOne({id:1,Name:"Chris"});{
-
C++で別の配列を使って配列の要素を最大化する方法
C++では、2つの配列を組み合わせて「大きい要素だけを持つ配列」を作り出すことができます。本記事では、サイズnの2つの配列が与えられたとき、両方の配列からn個の最大かつ重複しない要素を抜き出し、第2配列を優先しながら元の順序を保って第1配列を書き換えるアルゴリズムを、サンプルコードと実行結果あわせて解説します。 問題の概要 サイズnの2つの配列が与えられます。第2配列の要素を使って第1配列を最大化します。このとき、新しく作られる配列は次の条件を満たす必要があります。 両方の配列に含まれる要素の中から、大きい方からn個を選ぶ 選んだ要素は重複してはならない(すべて一意であること) 第2配列の要