MongoDBの集計操作で値を文字列リテラルに置き換える方法($literal活用術)
MongoDBの$literal演算子を使うと、集計パイプラインの中で任意の文字列リテラルをそのまま固定値として出力できます。通常、$projectなどでフィールド名を指定した場合はそのフィールドの「値」が参照されますが、$literalを組み合わせれば、フィールド名ではなく文字列そのものを結果に含めることが可能です。
サンプルコレクションの作成
まずは、ドキュメントを格納するコレクションを作成します。
> db.replacevaluedemo.insertOne({"StudentName":"Chris","StudentFavouriteSubject":{"TeacherName":"Bob","SubjectCode":"MySQL111"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0390a3f5e889d7a51994fd")
}
> db.replacevaluedemo.insertOne({"StudentName":"Mike","StudentFavouriteSubject":{"TeacherName":"David","SubjectCode":"3221Java"}});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e0390b8f5e889d7a51994fe")
}登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.replacevaluedemo.find().pretty();
上記のクエリを実行すると、次のような出力が得られます。
{
"_id" : ObjectId("5e0390a3f5e889d7a51994fd"),
"StudentName" : "Chris",
"StudentFavouriteSubject" : {
"TeacherName" : "Bob",
"SubjectCode" : "MySQL111"
}
}
{
"_id" : ObjectId("5e0390b8f5e889d7a51994fe"),
"StudentName" : "Mike",
"StudentFavouriteSubject" : {
"TeacherName" : "David",
"SubjectCode" : "3221Java"
}
}$literalで値を文字列リテラルに置き換えるクエリ
ここからが本題です。aggregate()の$projectステージ内で$literalを使用し、TeacherNameの値を文字列リテラル「UNKNOWN NAME」に置き換えてみます。
> db.replacevaluedemo.aggregate([{
... "$project": {
... "_id": 1,
... "StudentFavouriteSubject": {
... SubjectCode: 1,
... TeacherName: { $literal: "UNKNOWN NAME" }
... }
... }
... }]).pretty();実行結果
このクエリを実行すると、すべてのドキュメントのTeacherNameが固定の文字列リテラルに置き換えられて出力されます。
{
"_id" : ObjectId("5e0390a3f5e889d7a51994fd"),
"StudentFavouriteSubject" : {
"SubjectCode" : "MySQL111",
"TeacherName" : "UNKNOWN NAME"
}
}
{
"_id" : ObjectId("5e0390b8f5e889d7a51994fe"),
"StudentFavouriteSubject" : {
"SubjectCode" : "3221Java",
"TeacherName" : "UNKNOWN NAME"
}
}ポイントまとめ
- $literalは、指定した値を「式として評価せず」そのまま返す演算子です。
- 文字列だけでなく、数値・真偽値・配列・オブジェクトなどもリテラルとして扱えます。
- $projectや$addFieldsなどのステージと組み合わせることで、元データに関係なく固定値を出力できます。
このように$literalを活用すれば、個人情報をマスキングしたり、デフォルト値を一括で付与したりといった処理を、シンプルな集計パイプラインで実現できます。
-
MongoDBの集約(Aggregation)で特定のフィールド値を持つドキュメントを取得する方法
特定の条件に一致するドキュメントを取得したい場合には、aggregate() メソッドを使用します。ここでは、フィールド「Age」の値が「21」であるドキュメントを取得するケースを例に解説します。 サンプルコレクションの作成 まずは、ドキュメントを含むコレクションを作成しましょう。 > db.demo685.insertOne( ... { ... details: ... [ ... { ... Name:Chris, ... Age:21 ... }, ..
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>