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

クエリ結果に含まれないMongoDB入力データ

    $rangeを通じて可能 範囲を生成して自己検索を行う

    手順

    1. $group -最小日と最大日を動的に検索し、必要に応じてハードコーディングします
    2. $project -$rangeを生成します 、最小値と最大値に基づいて、必要に応じてハードコードします
    3. $unwind -範囲を解凍してドキュメントを作成します
    4. $project -生成された番号で日付を生成します
    5. $lookup -日付に基づいたコレクションへの自己参加
    6. $project -一致が見つかった場合はカウントを返し、そうでない場合は0。$ifNullを変更します。 $condへ mongoバージョンが3.6未満の場合

    パイプラインの集約

    db.t.aggregate(
        [   
            {
                $group : { _id : null, startDate : { "$min" : "$date" }, endDate : { "$max" : "$date" }} 
            },
            {
                $project : { _id : 0 , startDate : 1,  genNo : { $range : [ { $add : [ {"$dayOfMonth" : "$startDate"}, -1 ] }, { $add : [ {"$dayOfMonth" : "$endDate"} , 1 ] } ] } }
            },
            {
                $unwind : "$genNo"
            },
            {
                $project : { genDate : { $add : [ "$startDate", { $multiply : [ "$genNo" , 86400000 ] } ] } }
            },
            {
                $lookup : {
                    from : "t",
                    localField : "genDate",
                    foreignField : "date",
                    as : "out"
                }
            },
            {
                $project : { date : "$genDate", count : { $ifNull : [ { $arrayElemAt : ["$out.count", 0 ] }, 0 ] } }
            }
        ]
    )
    

    コレクション

    > db.t.find()
    { "_id" : ObjectId("5a5d78d5423b9839ce07bd77"), "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
    { "_id" : ObjectId("5a5d78d5423b9839ce07bd78"), "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
    > 
    

    集計結果

    { "date" : ISODate("2018-01-01T00:00:00Z"), "count" : 3 }
    { "date" : ISODate("2018-01-02T00:00:00Z"), "count" : 0 }
    { "date" : ISODate("2018-01-03T00:00:00Z"), "count" : 0 }
    { "date" : ISODate("2018-01-04T00:00:00Z"), "count" : 5 }
    { "date" : ISODate("2018-01-05T00:00:00Z"), "count" : 0 }
    > 
    



    1. MacOSXでMongoDBをアンインストールします

    2. 大規模なデータベースを効果的に管理する方法

    3. MongoDBは、集計を行うときに間違ったインデックスを選択しているようです

    4. トランザクションなしのMongoDBでの多対多の更新