MongoDBのアグリゲーション(集計)で$ifNull演算子を使う方法を徹底解説
MongoDBの$ifNullは、アグリゲーションパイプライン内で使用できる便利な演算子の一つです。指定した式を評価し、その結果がnullでない場合は元の値をそのまま返し、nullの場合は代替値を返します。フィールドに値が設定されていないデータを扱う際に、デフォルト値へ置き換えたいケースなどで非常に役立ちます。
$ifNullの基本構文
{ $ifNull: [ <評価する式>, <nullの場合の代替値> ] }
配列の最初の要素が評価対象の式、2番目の要素がnullだった場合に返される値です。
サンプルコレクションの作成
まず、動作確認用のコレクションを作成しましょう。「FirstName」というフィールドを持つドキュメントを複数件挿入し、一部にはあえてnullを設定します。
> db.demo372.insertOne({"FirstName":"Chris"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591aea2ae06a1609a00af6")
}
> db.demo372.insertOne({"FirstName":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591aef2ae06a1609a00af7")
}
> db.demo372.insertOne({"FirstName":"David"});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591af42ae06a1609a00af8")
}
> db.demo372.insertOne({"FirstName":null});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e591afb2ae06a1609a00af9")
}
これで、「Chris」「null」「David」「null」の4件のドキュメントが登録されました。
find()メソッドで登録内容を確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみます。
> db.demo372.find();
実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e591aea2ae06a1609a00af6"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e591aef2ae06a1609a00af7"), "FirstName" : null }
{ "_id" : ObjectId("5e591af42ae06a1609a00af8"), "FirstName" : "David" }
{ "_id" : ObjectId("5e591afb2ae06a1609a00af9"), "FirstName" : null }
アグリゲーションで$ifNullを使ってみる
ここからが本題です。$projectステージの中で$ifNullを使い、FirstNameがnullのドキュメントに対して「NOT PROVIDED(未入力)」という文字列を代わりに表示させます。
> db.demo372.aggregate(
... [
... {
... $project: {
...
... FirstName: { $ifNull: [ "$FirstName", "NOT PROVIDED" ] }
... }
... }
... ]
... )
このクエリでは、まず「$FirstName」で各ドキュメントのFirstNameフィールドを参照し、nullでなければ元の値を、nullであれば「NOT PROVIDED」を返しています。
実行結果
{ "_id" : ObjectId("5e591aea2ae06a1609a00af6"), "FirstName" : "Chris" }
{ "_id" : ObjectId("5e591aef2ae06a1609a00af7"), "FirstName" : "NOT PROVIDED" }
{ "_id" : ObjectId("5e591af42ae06a1609a00af8"), "FirstName" : "David" }
{ "_id" : ObjectId("5e591afb2ae06a1609a00af9"), "FirstName" : "NOT PROVIDED" }
結果のポイント
- 「Chris」や「David」のように値が存在するドキュメントは、元の値がそのまま出力されています。
- 一方、FirstNameがnullのドキュメントは、代替値である「NOT PROVIDED」に置き換わっています。
このように$ifNullを活用すれば、null値による表示崩れやアプリケーション側のエラーハンドリングの手間を減らせます。また、$ifNullは3つ以上の引数も受け取れるため、複数の候補フィールドを順番にチェックし、最初にnullでない値を返すといった使い方も可能です。ユーザー情報やフォーム入力データなど、必須項目が保証されていないコレクションを扱う際には、ぜひ活用してみてください。
-
MongoDBにJavaScript関数を保存・実行する方法をわかりやすく解説
MongoDBに保存されたJavaScriptを操作する方法 MongoDBでは、JavaScriptの関数をデータベース内の特別なコレクション「system.js」に保存できます。この仕組みを利用すれば、よく使う処理をサーバー側に登録しておき、必要なときにいつでも呼び出すことが可能です。関数の保存には db.system.js.save() メソッドを使用します。 JavaScript関数を保存する基本構文 db.system.js.save({ _id: anyFunctionName, value: function (returnValue) { re
-
MongoDBの集計パイプラインで複数フィールドをカウントする方法($facet活用)
MongoDBで複数のフィールドごとにドキュメントをカウントしたい場合、$facet演算子を使うのが効果的です。$facetは、同じ入力ドキュメント群に対して、単一のステージ内で複数の集計パイプラインを同時に処理できる強力な機能です。この記事では、実際にコレクションを作成し、$facetを組み合わせた集計クエリで複数フィールドの値をカウントする手順を解説します。1. サンプルコレクションの作成まず、insertOne()メソッドを使ってサンプルドキュメントを挿入します。各ドキュメントにはdetails1・details2・details3という3つのネストされたフィールドを持たせます。>