MongoDBの集約(Aggregation)と投影(Projection)の使い方を解説
MongoDBの集約と投影とは
MongoDBで特定のフィールドだけを抽出しながらデータを加工したい場合、aggregate()メソッドと$projectステージを組み合わせるのが効果的です。$projectは、パイプライン内で指定されたフィールドを持つドキュメントだけを次のステージへ渡す役割を果たします。
この記事では、実際にコレクションを作成し、$match・$unwind・$sort・$group・$projectを組み合わせた集約パイプラインの具体的な使い方を解説します。
サンプルコレクションの作成
まず、insertOne()を使ってドキュメントを含むコレクションを作成します。
> db.demo762.insertOne({
... "_id" : {
... "userId":101,
... "userName":"Chris"
... },
... "countryName" : "US",
... "details" : [
... {
... "Name" : "Robert",
... "DueDate" : "2020-04-10"
... },
... {
... "Name" : "Robert",
... "DueDate" : "2020-04-09"
... },
... {
... "Name" : "Robert",
... "DueDate" : "2020-03-06"
... }
... ]
... });
{
"acknowledged" : true,
"insertedId" : {
"userId" : 101,
"userName" : "Chris"
}
}登録したドキュメントの確認
find()メソッドを使うと、コレクション内のすべてのドキュメントを表示できます。
> db.demo762.find();
実行すると、次のような出力が得られます。
{ "_id" : { "userId" : 101, "userName" : "Chris" }, "countryName" : "US", "details" : [ { "Name" : "Robert", "DueDate" : "2020-04-10" }, { "Name" : "Robert", "DueDate" : "2020-04-09" }, { "Name" : "Robert", "DueDate" : "2020-03-06" } ] }集約と投影を行うクエリ
以下は、MongoDBの集約(aggregation)と投影(projection)を実行するクエリの例です。このパイプラインでは、該当ユーザーのドキュメントを絞り込み、配列フィールドdetailsを展開し、期日(DueDate)の昇順にソートした後、グループ化して先頭2件のみを$projectで抽出しています。
> db.demo762.aggregate([
... { "$match": {
... "_id": { "$eq": { userId:101,userName:"Chris" }}
... }},
... { "$unwind": "$details" },
... { "$sort": { "details.DueDate": 1 }},
... { "$group": {
... "_id": "$_id",
... "details": { "$push": "$details" },
... "countryName": { "$first": "$countryName" }
... }},
... { "$project": { "details": { "$slice": ["$details", 2] } ,"countryName": 1 }}
... ]).pretty();実行結果
上記のクエリを実行すると、次のような結果が出力されます。$sliceによって、ソート済みのdetails配列から最初の2件だけが取得されている点に注目してください。
{
"_id" : {
"userId" : 101,
"userName" : "Chris"
},
"countryName" : "US",
"details" : [
{
"Name" : "Robert",
"DueDate" : "2020-03-06"
},
{
"Name" : "Robert",
"DueDate" : "2020-04-09"
}
]
}まとめ
MongoDBの集約パイプラインでは、$matchで対象を絞り込み、$unwindで配列を展開し、$sortで並べ替え、$groupで再構成した後、$projectと$sliceを組み合わせることで、必要なフィールドや配列要素だけを柔軟に取得できます。大量のデータから必要な部分だけを効率的に取り出したい場合に、ぜひ活用してみてください。
-
MongoDBのNumberLong(x)とNumberLong("x")の違いとは?
MongoDBにおけるNumberLong(x)とNumberLong(x)の違いとは?MongoDBで64ビット整数を扱う際に使われるNumberLongですが、引数の渡し方によって挙動が大きく異なります。数値をそのまま渡すNumberLong(x)の場合、値が精度の限界を超えると丸め処理が行われてしまうのに対し、文字列として渡すNumberLong(x)では丸められることなく正確な値が保持されます。この現象の原因は、シェル上の数値リテラルが倍精度浮動小数点数(double)として解釈されることにあります。988998985857575789のような非常に大きな整数は、double型では正確
-
PythonでMongoDBを操作する方法|pymongoを使った基本操作入門
MongoDBは広く利用されているドキュメント指向データベースであり、NoSQLデータベースの一種です。Pythonはpymongoなどのモジュールを介してMongoDBと連携し、データの作成や操作を行うことができます。本記事では、その具体的な方法を解説します。なお、PythonからMongoDBへ接続するには、システムにMongoDBがあらかじめインストールされている必要があります。MongoDBのセットアップ手順については、専用のチュートリアル記事をご参照ください。 pymongoのインストール MongoDBとやり取りするには、pymongoというモジュールが必要です。以下のコマンドを