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

$weekmongodbクエリでその週に一致するレコードがない場合にその週に0を表示する方法

    $week として 0の間の値を返すことができます および53 54を期待していると思います 結果として0のドキュメント またはdocumentCountのゼロ以外の値 。これを実現するには、すべてのドキュメントを1つにまとめる必要があります( $グループ -nullによるing )次に出力を生成します。

    数値の範囲を生成するには、 $ range 演算子を使用すると、 $map 。ドキュメントの配列を複数のドキュメントに変換するには、 $くつろぐ

    db.collectionName.aggregate([
        //where query
        { "$match": {  $and:[{CreatedOn:{$lte:ISODate("2018-07-14T13:59:08.266+05:30")}},{CreatedOn:{$gte:ISODate("2018-06-10T13:59:08.266+05:30")}}] } },
        //distinct column 
        {
            "$group": {
                _id: {$week: '$CreatedOn'},
                documentCount: {$sum: 1}
            }
        },
        {
            $group: {
                _id: null,
                docs: { $push: "$$ROOT" }
            }
        },
        {
            $project: {
                docs: {
                    $map: {
                        input: { $range: [ {$week:ISODate("2018-06-10T13:59:08.266+05:30")}, {$week:ISODate("2018-07-14T13:59:08.266+05:30")}]},
                        as: "weekNumber",
                        in: {
                            $let: {
                                vars: { index: { $indexOfArray: [ "$docs._id", "$$weekNumber" ] } },
                                in: {
                                    $cond: {
                                        if: { $eq: [ "$$index", -1 ] },
                                        then: { _id: "$$weekNumber", documentCount: 0 },
                                        else: { $arrayElemAt: [ "$docs", "$$index" ] }
                                    }
                                }
                            }
                        }
                    }
                }
            }
        },
        {
            $unwind: "$docs"
        },
        {
            $replaceRoot: {
                newRoot: "$docs"
            }
        }
    ])
    

    $indexOfArray を使用する 現在のドキュメントの配列にドキュメント(それ以外の場合は-1)と $ arrayElemAt docsから既存のドキュメントを取得するには 。最後のステップ( $ replaceRoot )は、1つのレベルのネスト(docs)を取り除くだけです。 )。出力:

    { "_id" : 0, "documentCount" : 0 }
    { "_id" : 1, "documentCount" : 0 }
    { "_id" : 2, "documentCount" : 0 }
    ...
    { "_id" : 22, "documentCount" : 0 }
    { "_id" : 23, "documentCount" : 2 }
    { "_id" : 24, "documentCount" : 9 }
    { "_id" : 25, "documentCount" : 1 }
    { "_id" : 26, "documentCount" : 1 }
    { "_id" : 27, "documentCount" : 0 }
    ...
    { "_id" : 52, "documentCount" : 0 }
    { "_id" : 53, "documentCount" : 0 }
    

    $mapの入力を変更して、返される結果を簡単にカスタマイズできます ステージ。たとえば、input: [21, 22, 23, 24]のような定数の配列を渡すことができます。 同様に。

    編集:指定された日付の間の週を取得するには、$weekを使用できます 数値を取得するための開始日と終了日。




    1. pymongoを使用して既存のドキュメントコレクション/dbに接続するにはどうすればよいですか?

    2. MongoDBドキュメント内の特殊文字を含む文字列を検索しています

    3. MongoDB$inアグリゲーションパイプラインオペレーター

    4. $unsetと$setをmongoDBで組み合わせて使用​​する方法