MongoDBで$group内に計算された式を$pushするクエリ
MongoDBで$group内に計算された式を$pushする方法
$groupステージの中で計算された式(条件分岐によって変換した値など)を配列へプッシュするには、aggregate()メソッドと$push演算子を組み合わせます。さらに$cond演算子を併用すれば、各ドキュメントのフィールド値に応じた条件分岐も簡単に実現できます。
サンプルコレクションの作成
まずは、ドキュメントを格納するコレクションを作成しましょう。
> db.demo24.insertOne({"Id":100,"Status":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c58722d07d3b95082e72")
}
> db.demo24.insertOne({"Id":100,"Status":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c58a22d07d3b95082e73")
}
> db.demo24.insertOne({"Id":100,"Status":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c58f22d07d3b95082e74")
}
> db.demo24.insertOne({"Id":100,"Status":true});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c59122d07d3b95082e75")
}
> db.demo24.insertOne({"Id":100,"Status":false});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e14c59222d07d3b95082e76")
}
登録済みドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示してみましょう。
> db.demo24.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e14c58722d07d3b95082e72"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c58a22d07d3b95082e73"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c58f22d07d3b95082e74"), "Id" : 100, "Status" : false }
{ "_id" : ObjectId("5e14c59122d07d3b95082e75"), "Id" : 100, "Status" : true }
{ "_id" : ObjectId("5e14c59222d07d3b95082e76"), "Id" : 100, "Status" : false }
$group内で計算された式を$pushするクエリ
以下が、$pushを使用して$group内に計算された式をプッシュするクエリです。ここでは$cond演算子によって、Statusフィールドがtrueの場合は「Active」、falseの場合は「InActive」という文字列に変換した上で、配列に追加しています。
> db.demo24.aggregate({$group: {_id:'$Id', AllValues: {$push: {$cond: [{$eq: ['$Status', true]},'Active','InActive']}}}})
実行結果は次の通りです。
{ "_id" : 100, "AllValues" : [ "Active", "Active", "InActive", "Active", "InActive" ] }
クエリのポイント
- _id: '$Id' … Idフィールドの値を基準にドキュメントをグループ化します。
- AllValues: {$push: …} … グループごとの計算結果を「AllValues」という名前の配列に蓄積します。
- {$cond: [{$eq: ['$Status', true]}, 'Active', 'InActive']} … Statusがtrueなら「Active」、それ以外なら「InActive」を返す三項演算式的な条件式です。
このように、$groupと$push、そして$condを組み合わせることで、集計処理の中で各ドキュメントの値を柔軟に変換しながら、結果を一つの配列としてまとめることができます。
-
MongoDBで_idを使ってグループ化するクエリの書き方
MongoDBでドキュメントをグループ化するには、集計パイプライン(aggregation pipeline)の $group ステージを使用します。この記事では、実際にコレクションを作成し、$group を使ってデータを集計する手順を具体的な例とともに解説します。 サンプルコレクションの作成 まずは、動作確認用のコレクションにドキュメントを挿入してみましょう。以下のように insertOne() メソッドを使って、スコア情報を持つドキュメントを複数件登録します。 > db.demo529.insertOne({Score:10}); { acknowledged : true
-
MongoDBで埋め込みドキュメントの配列をクエリし、新しいドキュメントをプッシュする方法
MongoDBで埋め込みドキュメントの配列に対してクエリを実行し、条件を満たす場合にのみ新しいドキュメントを追加したい場合は、updateメソッドと$push演算子を組み合わせて使用します。ここでは、実際のサンプルコードを使って手順を詳しく解説します。 手順1:サンプルコレクションの作成 まず、insertOne()メソッドを使って、埋め込みドキュメントの配列を含むドキュメントを作成しましょう。 > db.demo573.insertOne( ... { ... _id :101, ... SearchInformation : [ ...