MongoDBのaggregate()で各ドキュメントの複数日付フィールドから最も古い日付を取得する方法
MongoDBで各ドキュメントに保存された複数の日付フィールドの中から、最も古い日付を取得したい場合があります。 suchな場合は、集計パイプライン(aggregate())内で$min演算子を使用することで簡単に実現できます。
この記事では、サンプルコレクションを作成し、3つの日付フィールド(Date1、Date2、Date3)から最も古い日付を抽出するクエリを段階的に解説します。
1. サンプルコレクションの作成
まず、insertOne()メソッドを使ってドキュメントを含むコレクションを作成します。
> db.demo353.insertOne({"Date1":new ISODate("2019-01-10"),"Date2":new ISODate("2016-01-21"),"Date3":new ISODate("2020-04-11")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e568261f8647eb59e5620be")
}
> db.demo353.insertOne({"Date1":new ISODate("2011-11-20"),"Date2":new ISODate("2013-12-10"),"Date3":new ISODate("2014-01-05")});
{
"acknowledged" : true,
"insertedId" : ObjectId("5e56827ff8647eb59e5620bf")
}2. 登録されたドキュメントの確認
find()メソッドを使って、コレクション内のすべてのドキュメントを表示します。
> db.demo353.find();
このクエリを実行すると、次のような出力が得られます。
{ "_id" : ObjectId("5e568261f8647eb59e5620be"), "Date1" : ISODate("2019-01-10T00:00:00Z"), "Date2" : ISODate("2016-01-21T00:00:00Z"), "Date3" : ISODate("2020-04-11T00:00:00Z") }
{ "_id" : ObjectId("5e56827ff8647eb59e5620bf"), "Date1" : ISODate("2011-11-20T00:00:00Z"), "Date2" : ISODate("2013-12-10T00:00:00Z"), "Date3" : ISODate("2014-01-05T00:00:00Z") }3. 最も古い日付を取得するクエリ
各ドキュメントの中で最も古い日付を求めるには、以下のようにaggregate()と$projectステージを組み合わせます。$min演算子は指定した複数の値の中から最小値(=最も古い日付)を返します。また、$ifNullを使うことで、フィールドが存在しない場合やnullの場合に現在日時(new Date())を代わりに使用し、エラーを防ぎながら安全に処理できます。
> db.demo353.aggregate([
... {
... $project: {
... OldestDate: {
... $min: [
... { $ifNull: [ "$Date1", new Date() ] },
... { $ifNull: [ "$Date2", new Date() ] },
... { $ifNull: [ "$Date3", new Date() ] },
... ]
... }
... }
... }
... ])4. 実行結果
上記のクエリを実行すると、各ドキュメントごとに最も古い日付が「OldestDate」として出力されます。
{ "_id" : ObjectId("5e568261f8647eb59e5620be"), "OldestDate" : ISODate("2016-01-21T00:00:00Z") }
{ "_id" : ObjectId("5e56827ff8647eb59e5620bf"), "OldestDate" : ISODate("2011-11-20T00:00:00Z") }まとめ
MongoDBで複数の日付フィールドから最も古い日付を取得するには、aggregate()の$projectステージで$min演算子を使用します。$ifNullを組み合わせれば、欠損フィールドがあっても柔軟に対応できます。このテクニックは、イベント開始日・更新日・期限日など、複数の日時の中から最新・最古を判定したいさまざまなユースケースで応用できます。
-
MongoDBでネストされたドキュメントを更新する方法|位置演算子$を使った配列要素の更新手順
MongoDBでは、ドキュメント内の配列に格納されたネストされた(入れ子の)ドキュメントも、位置演算子「$」を使うことで効率的に更新できます。この記事では、実際のコード例を通じて、配列内の特定のサブドキュメントを更新する手順をわかりやすく解説します。 1. サンプルコレクションの作成 まず、insertOne()メソッドを使用して、ネストされたドキュメントを含むコレクションを作成します。ここでは「Information」というフィールドに、複数のサブドキュメントを持つ配列を格納しています。 > db.demo595.insertOne( { Information: [ { _i
-
【MongoDB】ネストされた(入れ子構造の)ドキュメントを更新するクエリの書き方
MongoDBでは、入れ子(ネスト)になったサブドキュメントのフィールドを更新する際、update()メソッドとドット表記(dot notation)を組み合わせて使用します。ドット表記を使うことで、深い階層にあるフィールドを直接指定して値を変更できます。1. サンプルコレクションの作成まず、ネストされたドキュメントを含むコレクションを作成しましょう。以下のコマンドでdemo607というコレクションにドキュメントを挿入します。> db.demo607.insertOne( ... { ... id: 1, ... Info1 : { ...