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

MongoDBは行方不明の日を埋めます

    集計の使用 この質問を完全に処理するのは面倒です。
    しかし、到達することはできます。
    (MongoDB V2.6 +が必要です)

    var proj1 = {
        "$project" : {
            "created" : 1,
            "_id" : 0,
            "h" : {
                "$hour" : "$created"
            },
            "m" : {
                "$minute" : "$created"
            },
            "s" : {
                "$second" : "$created"
            },
            "ml" : {
                "$millisecond" : "$created"
            }
        }
    };
    
    var proj2 = {
        "$project" : {
            "created" : {
                "$subtract" : [ "$created", {
                    "$add" : [ "$ml", {
                        "$multiply" : [ "$s", 1000 ]
                    }, {
                        "$multiply" : [ "$m", 60, 1000 ]
                    }, {
                        "$multiply" : [ "$h", 60, 60, 1000 ]
                    } ]
                } ]
            }
        }
    };
    
    var group1 = {
            $group : {
                _id : "$created",
                count : {
                    $sum : 1
                }
            }
        };
    
    var group2 = {
            $group : {
                _id : 0,
                origin : {
                    $push : "$$ROOT"
                },
                maxDate : {
                    $max : "$_id"
                }
            }
    };
    
    var step = 24 * 60 * 60 * 1000; // milliseconds of one day
    
    var project3 = {
        $project : {
            origin : 1,
            extents : {
                $map : {
                    "input" : [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29],
                    "as" : "e",
                    "in" : {
                        _id : {
                            $subtract : [ "$maxDate", {
                                $multiply : [ step, "$$e"]
                            }]
                        },
                        count : {
                            $add : [0]
                        }
                    }
                }
            }
        }
    };
    
    var project4 = {
            $project : {
                _id : 0,
                values : {
                    $setUnion : [ "$origin", "$extents"]
                }
            }
    };
    
    var unwind1 = {
            $unwind : "$values"
    };
    
    var group3 = {
            $group : {
                _id : "$values._id",
                count : {
                    $max : "$values.count"
                }
            }
    };
    
    db.product.aggregate([ proj1, proj2, group1, group2, project3, project4,
            unwind1, group3, {
                $sort : {
                    _id : 1
                }
            } ]);
    

    参考までに、アプリケーションの最後に不足している部分を次のように埋めたいと思います。

    function sortResult(x, y) {
        var t1 = x._id.getTime();
        var t2 = y._id.getTime();
        if (t1 < t2) {
            return -1;
        } else if (t1 == t2) {
            return 0;
        } else {
            return 1;
        }
    }
    
    var result = db.product.aggregate();
    
    var endDateMilliseconds = result[result.length - 1]._id.getTime();
    var step = 24 * 60 * 60 * 1000; // milliseconds of one day
    
    var map = {};
    for (var i in result) {
        map[ result[i]._id.getTime() ] = result[i];
    }
    
    for (var ms = endDateMilliseconds, x = 1; x < 30; x++) {
        ms -= step;
        if ( ! ( ms in map ) ) {
            map[ms] = {_id : new Date(ms), count : 0};
        }
    }
    
    var finalResult = [];
    for (var x in map) {
        finalResult.push(map[x]);
    }
    finalResult.sort(sortResult);
    printjson(finalResult);
    


    1. Mongoose / mongoDBクエリが結合します..しかし、私はSQLのバックグラウンドから来ています

    2. MongoDBとSQLデータベースの違い

    3. Javaを使用してJSONファイルからMongoDBにデータをインポートする

    4. 2つのフィールドを比較する際のMongoDbクエリ条件