MongoDBですべてのサブドキュメントからオブジェクトの一意なペアを取得する方法
MongoDBで重複を排除した一意な(distinct)オブジェクトのペアを取得するには、集計パイプラインの $group 演算子を使用します。この記事では、実際のコード例を使って、すべてのサブドキュメントから名前ごとにスコアをグループ化し、合計値を求める方法を解説します。
サンプルコレクションの作成
まず、insertOne() メソッドを使ってドキュメントを含むコレクションを作成します。
> db.demo522.insertOne({"Name":"John","Score":45});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b646b3fbf26334ef611b")
}
> db.demo522.insertOne({"Name":"Bob","Score":67});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b64eb3fbf26334ef611c")
}
> db.demo522.insertOne({"Name":"John","Score":55});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b655b3fbf26334ef611d")
}
> db.demo522.insertOne({"Name":"Bob","Score":33});{
"acknowledged" : true,
"insertedId" : ObjectId("5e89b65cb3fbf26334ef611e")
}上記のコレクションには、「John」と「Bob」それぞれ2件ずつ、計4件のドキュメントが登録されています。
find()メソッドで全ドキュメントを表示
find() メソッドを使用すると、コレクション内のすべてのドキュメントを確認できます。
> db.demo522.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e89b646b3fbf26334ef611b"), "Name" : "John", "Score" : 45 }
{ "_id" : ObjectId("5e89b64eb3fbf26334ef611c"), "Name" : "Bob", "Score" : 67 }
{ "_id" : ObjectId("5e89b655b3fbf26334ef611d"), "Name" : "John", "Score" : 55 }
{ "_id" : ObjectId("5e89b65cb3fbf26334ef611e"), "Name" : "Bob", "Score" : 33 }「John」は45と55、「Bob」は67と33というスコアを持っていることがわかります。
$groupを使って一意なペアを取得する
次の集計パイプラインでは、$group で Name フィールドごとにドキュメントをグループ化し、$sum 演算子で各グループのスコア合計を計算しています。その後、$project を使って出力形式を整えています。
> var query = [
... {
... "$group": {
... "_id": "$Name",
... "Score": { "$sum": "$Score" }
... }
... },
... {
... "$project": {
... "Name": "$_id", "_id": 0, "Score": 1
... }
... }
... ];
>
> db.demo522.aggregate(query);このクエリを実行すると、以下の出力が得られます。
{ "Score" : 100, "Name" : "Bob" }
{ "Score" : 100, "Name" : "John" }結果の解説
出力を見ると、重複していた「John」と「Bob」のデータが、それぞれ一意なペアとしてまとめられていることが確認できます。具体的には以下のように計算されています。
- John: 45 + 55 = 100
- Bob: 67 + 33 = 100
このように、$group と $project を組み合わせることで、MongoDBのすべてのサブドキュメントから一意なオブジェクトのペアを効率的に抽出できます。大量のデータから重複を排除して集約したい場合に、非常に便利なテクニックです。
-
MongoDBで配列内の個別の値の長さを取得する方法
MongoDBで配列内の個別の値の長さを取得する方法配列から重複しない値(個別の値)を取得するには、MongoDBのdistinct()メソッドを使用します。さらに、取得した結果の長さ(要素数)を知りたい場合は、JavaScriptのlengthプロパティを組み合わせることで簡単に実現できます。この記事では、実際のコレクションを作成しながら、具体的な手順をわかりやすく解説します。1. ドキュメントを含むコレクションを作成するまずは、名前の配列を持つドキュメントを挿入してコレクションを作成します。> db.demo36.insertOne({Names:[Chris,Bob]}); {
-
MongoDBで配列内にネストされたドキュメントを持つドキュメントを検索する方法
MongoDBでは、配列の中に別のドキュメント(ネストされたドキュメント)が含まれている場合でも、find()メソッドとドット記法(dot notation)を組み合わせることで、目的のドキュメントを簡単に抽出できます。この記事では、実際のコード例を使ってその手順をわかりやすく解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使用して、配列内にネストされたドキュメントを持つコレクションを作成します。> db.demo465.insertOne( ... { ... id: 101, ... details: [{ ... Na