Найти и усреднить все данные между двумя переменными даты в node.js и mongodb

У меня есть коллекция mongodb, которую я сделал, загружая все исторические сделки Ethereum с GDAX. В настоящее время я пытаюсь протестировать торговые алгоритмы, и я хочу начать с простого десятидневного среднего. Данные в коллекции выглядят примерно так

[{
    "time": "2014-11-07T22:19:28.578544Z",
    "trade_id": 74,
    "price": "10.00000000",
    "size": "0.01000000",
    "side": "buy"
}, {
    "time": "2014-11-07T01:08:43.642366Z",
    "trade_id": 73,
    "price": "100.00000000",
    "size": "0.01000000",
    "side": "sell"
}]

Данные сохраняются в формате ISO, не совсем уверенный, является ли это строкой или датой ISO, но попытка преобразовать переменные времени начала и окончания приводит к добавлению восточного стандартного времени в конце, которого нет в сохраненных данных. Код ниже сделает следующее. Сначала он ищет самый высокий trade_id в коллекции. Затем, начиная с trade_id 1, он просматривает каждый элемент в коллекции, получая все элементы в диапазоне за 10 дней до даты. Вот где я застрял. У меня console.log, я создал переменные даты начала и окончания, которые разделены на 10 дней, но когда я запрашиваю коллекцию, используя эти переменные, я не получаю результатов. Использование двух случайных дат в одинарных кавычках работает, поэтому я не вижу разницы в использовании двух переменных. Кроме того, я хотел бы также вычислить среднее значение всех результатов по цене в том же запросе, если это возможно. Буду признателен за любые предложения или помочь с этим. Благодарю.

var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/EthHistory";

function getNextTradeID(maxID, i){
    mongo.collection("EthTestData").find({ 
        trade_id: i }).toArray(function(err, newid) { 
            if (err) {
                console.log(err);
                return;
            }
            i = i + 1;
            var startTimeAvg = new Date(Date.parse(newid[0].time));
            var endTimeAvg = new Date(startTimeAvg- (60*60*24*10*1000))
            getTenDayAverage(maxID, i, startTimeAvg, endTimeAvg);
    });
}

function getTenDayAverage(maxID, i, startTimeAvg, endTimeAvg) {
    console.log(startTimeAvg, endTimeAvg)
    mongo.collection("EthTestData").find({ 
        time:{ 
            $gte: (endTimeAvg), 
            $lte: (startTimeAvg) }}).toArray(function(err, result) {    
        if (err) {
            console.log(err);
            return;
        }
        console.log(result)
        tradeIDLoop(maxID, i);
    });
}

function tradeIDLoop(maxID, i) {        
    if (maxID < i) {
        mongo.close
    }
    else {
        getNextTradeID(maxID, i);
    }
};

function getMaxTradeID() {
    mongo.collection("EthTestData").find().sort({trade_id:-1}).limit(1).toArray(function(err, result) { 
        if (err) {
            console.log(err);
            return;
        }
        var i = 1  
        var maxID = Number(result[0].trade_id);    
        tradeIDLoop(maxID, i);        
    });   
};

MongoClient.connect(url, function(err, db) {
    if (err) {
        console.log(err);
        return;
    }
    mongo = db
    getMaxTradeID();   
        
});

Наконец, я хочу обновить элемент в коллекции, в которой я начал цикл, с результатом, а затем перейти к следующей записи. Если это может быть включено за 10 дней выбора данных, и в среднем, возможно, кто-то может подсказать, как это сделать, иначе я просто воспользуюсь другим запросом. Пытаюсь сделать это максимально эффективным, так как я должен сделать это для 19 миллионов с лишним записей.

1 ответ

По-видимому, информация хранится как ISOString. Использование функции.toISOString() теперь дает результаты. Тем не менее, цикл замедляется значительно, почти до ползания после циклов около 20 Кб, как только он извлекает полные 10 дней данных. Возможно, этот метод не подходит для тестирования на истории.

Другие вопросы по тегам