sql >> データベース >  >> NoSQL >> MongoDB

SQLのグループ連結のアナログ

    これまでのコメントによると、何をグループ化しているのか、最終結果として何を望んでいるのかは明確ではありません。ただし、日付を「ちょうど1日」のように連結して、時間や分を含めないようにしたいという場合を除きます。おそらく、あなたはそれらの明確な日を何らかの目的のために望んでいます。

    さまざまな日付演算子 があります パイプラインでは、日付に使用できます。これは、 $concat<です。 / a> オペレーターも。残念ながら、すべての日付演算子 結果として整数を生成し、必要な日付文字列の種類については、 $ concat 文字列でのみ機能します。もう1つの問題は、キャストできないことです。 整数を集計内の文字列型に変換します。

    しかし、あなたはできます サブドキュメントを使用します。ここでは、日付を使用します:

    db.record.aggregate([
        // Unwind the array to work with it
        {$unwind: "$date"},
    
        // project into our new 'day' document
        {$project:{ 
            day: { 
                year: {$year: "$date"},
                month: {$month: "$date"}, 
                day: {$dayOfMonth: "$date"}
            }
         } },
    
         // optionalally sort if date order is important [ oldest -> newest ] 
         {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},
    
         // Wind back unique values into the array
         {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
    ])
    

    したがって、文字列ではありませんが、後処理して1つに簡単にまとめることができますが、最も重要なのは、グループ化して並べ替えることができることです。

    一意のdatesが必要な場合でも、原則は同じです。 このようにして、最後に配列として、または合計をそれらの日付でグループ化するかどうかを指定します。したがって、主に、日付演算子を使用した$unwindと$projectの部分に注意してください。

    -編集-

    この投稿 に示されているコミュニティに感謝します この文書化されていないがあります $ substrの動作 、整数を文字列としてキャストできます。

    db.record.aggregate([
        // Unwind the array to work with it
        {$unwind: "$date"},
    
        // project into our new 'day' document
        {$project:{ 
            day: { 
                year: {$year: "$date"},
                month: {$month: "$date"}, 
                day: {$dayOfMonth: "$date"}
            }
         } },
    
         // optionalally sort if date order is important [ oldest -> newest ] 
         {$sort: { "day.year": -1, "day.month": -1, "day.day": -1}},
    
         // now we are going to project to a string ** magic @heinob **
         {$project: { 
             day: {$concat: [
                 {$substr: [ "$day.year", 0, 4 ]},
                 "-",
                 {$substr: [ "$day.month", 0, 2 ]},
                 "-",
                 {$substr: [ "$day.day", 0, 2 ]}
             ]}
         }},
    
         // Wind back unique values into the array
         {$group: {_id:"$_id", days: {$addToSet: "$day"} }}
    ])
    

    そして今、days 文字列です。前に述べたように、順序付けが重要な場合は、これまでと同じようにドキュメントタイプに投影し、数字キーで並べ替えるのが最善の方法です。当然、日付を変換する$ projectは、簡潔にするために$ groupステージにまとめることができます。これは、ドキュメント全体を操作するときにおそらく実行したいことです。



    1. Mongodbの埋め込み構造の更新と検索?

    2. MongoDBの日付演算子、メソッド、変数のリスト

    3. Ubuntu20.04にApacheCouchDBをインストールする方法

    4. MongoDBでのaggregate($ match)とfindの違いは?