MongoDBの$addToSet演算子で重複のない値を取得・表示する方法
MongoDBの$addToSet演算子は、セット(配列)に重複する要素が追加されないよう保証するための演算子です。すでに存在する値を追加しようとしても、それは自動的に無視されます。この記事では、この演算子を使って配列フィールドから重複のない値を取得・表示する手順を解説します。
サンプルコレクションの作成
まず、ドキュメントを含むコレクションを作成しましょう。
> db.getDistinctDemo.insertOne({"Values":[100,200]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cef69f9ef71edecf6a1f69d")
}
> db.getDistinctDemo.insertOne({"Values":[300,100]});
{
"acknowledged" : true,
"insertedId" : ObjectId("5cef6a07ef71edecf6a1f69e")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.getDistinctDemo.find().pretty();
実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5cef69f9ef71edecf6a1f69d"),
"Values" : [
100,
200
]
}
{
"_id" : ObjectId("5cef6a07ef71edecf6a1f69e"),
"Values" : [
300,
100
]
}2つのドキュメントはどちらも「100」という値を持っています。これが重複要素にあたります。
$addToSetで重複のない値をまとめる
続いて、aggregate()メソッドと$groupステージを組み合わせて、配列フィールドの値を重複なく1つのセットにまとめるクエリを見てみましょう。
> db.getDistinctDemo.aggregate([
{ "$group": { "_id": 0,
"MyValues": { "$addToSet": "$Values" }
} }
]);このクエリを実行すると、以下の出力が得られます。
{ "_id" : 0, "MyValues" : [ [ 300, 100 ], [ 100, 200 ] ] }ここでのポイントは、$addToSetが「配列全体」を1つの要素として比較している点です。[300, 100]と[100, 200]は互いに異なる配列なので、どちらもそのままセットに残ります。
応用:$unwindで個別の値に展開する
配列の中身をバラして、数値単位で重複を排除したい場合は、$unwindステージを先に適用します。
> db.getDistinctDemo.aggregate([
{ "$unwind": "$Values" },
{ "$group": { "_id": 0,
"MyValues": { "$addToSet": "$Values" }
} }
]);実行結果は次のとおりです。
{ "_id" : 0, "MyValues" : [ 300, 100, 200 ] }このように$unwindと$addToSetを組み合わせれば、すべてのドキュメントにまたがった完全にユニークな値の一覧を簡単に取得できます。なお、通常の$pushは重複を許可して追記するのに対し、$addToSetは重複を自動的に除外する点が大きな違いです。用途に応じて使い分けるとよいでしょう。
-
MongoDBで配列内の要素を指定して特定のドキュメントを取得する方法
MongoDBのfind()でドット表記を使った特定ドキュメントの取得MongoDBで配列内に格納されたフィールドの値を条件に、特定のドキュメントだけを取得したい場合は、find()メソッドとドット表記(dot notation)を組み合わせるのが基本です。この記事では、実際のコード例を通して、その手順をわかりやすく解説します。1. サンプルコレクションとドキュメントの作成まずはテスト用のコレクションを作成し、配列の中にオブジェクトを持つドキュメントを挿入してみましょう。insertOne()メソッドを使用して、以下のように3件のドキュメントを登録します。> db.demo672.ins
-
MongoDBでforループを使用して値をプッシュ(挿入)する方法
MongoDBでforループを使用して値をプッシュ(挿入)する方法MongoDBで値を繰り返しコレクションへ挿入(プッシュ)したい場合、save()メソッドとforループを組み合わせることで簡単に実現できます。ここでは、実際のコード例を交えながら手順を解説します。1. forループでドキュメントを作成するまず、forループを使ってコレクションにドキュメントを作成します。以下の例では、ループを6回まわして同じ内容のドキュメントを保存しています。> for(var v=1; v<7; v++) {... db.demo739.save({Name:Chris,SubjectName:M