Подсчитать, где для базы данных indexedDB - PullRequest
0 голосов
/ 03 января 2019

Я храню даты в базе данных indexedDB и хочу подсчитать количество записей, произошедших в 2018, 2017 годах и т. Д., И распечатать их в таблице.У меня проблема в том, что я не уверен, как сравнить даты с предыдущими записями, чтобы правильно их подсчитать.Это своего рода эквивалент счетчика, где функция - это SQL.

Сначала у меня было что-то подобное, но я не уверен, что это сработает.Даты хранятся примерно так: «Среда, 05 января 2018 года», поэтому используется метод Slice ().

        var cursor = event.target.result;

        //2016
        firstPostYear = cursor.value.date.slice(-4);
        alert(firstPostYear);
        var count = 0;

        if (cursor)
        {
            if (cursor.value.date.slice(-4) === firstPostYear)
            {
                count += 1;
            }
            else
            {
                console.log(count);
                count = 0;
                firstPostYear = cursor.value.date.slice(-4)
            }

            cursor.continue()
        }

Если кто-то может показать мне более простой способ сделать это, я был бы признателен.

Это для Райана:

function filterSelection(filter) 
{
    var objectStore = db.transaction('posts').objectStore('posts');

objectStore.openCursor().onsuccess = function (event) 
{
    var cursor = event.target.result;

    if (filter === "all")
    {    
        //Get the number of all time posts
        var transaction = db.transaction(['posts'], 'readonly');
        var objectStore = transaction.objectStore('posts');

        var countRequest = objectStore.count();
        countRequest.onsuccess = function() 
        {
            // Get table element
            var table = document.getElementById("activityLog");
            //Get table length
            var rowCount = table.rows.length;
            // Create a table row
            var row = table.insertRow(rowCount);

            // Insert new cells positions 1-5 of the "new" <tr> element:
            var cell1 = row.insertCell(0);
            var cell2 = row.insertCell(1);

            // Add some text to the new cells:
            cell1.innerHTML = "All time";
            cell2.innerHTML = countRequest.result;
        }

    }

    else if (filter === "Years")
    {
        //Get the number of posts each year
        var cursor = event.target.result;

        var counts = {};

        if (cursor) 
        {
            const year = cursor.value.date.slice(-4);

            if ( !(year in counts) ) 
            {
                counts[year] = 0;
            }
            (counts[year]) + 1;
            alert(counts[year]);

            cursor.continue();

        }
        else
        {

        }

    }

1 Ответ

0 голосов
/ 03 января 2019

Так что я не совсем знаю, как выглядит хранилище объектов, в котором хранятся эти данные, поэтому я мог бы сделать некоторые предположения относительно этого и того, что вы делаете.

Прежде всего, есть один лучший способ сделать то, что вы делаете, чем открыть курсор и пройтись по всему магазину. Если бы вы могли вообще реструктурировать свои данные, вы могли бы создать поле, в котором будет храниться год объекта, создать индекс для этого поля и, по сути, выполнить команду <ObjectStoreReference>.index('year').count(), чтобы очень быстро получить все документы.

Но если вы не можете, то вам нужно сделать это таким образом. Однако то, как вы сейчас отслеживаете информацию, используя курсорный подход, не позволит вам распечатать все в таблице, потому что каждый раз, когда год, который вы генерируете из cursor.value.date.slice(-4), меняется с вашего firstPostYear, вы сбрасываете счет.

Вы можете попробовать сделать что-то вроде

const counts = {};

if (cursor) {
    const year = cursor.value.date.slice(-4);
    if ( !(year in counts) ) {
        counts[year] = 0;
    }
    counts[year]++;
    cursor.continue();
}

И затем вы можете циклически перебирать записи в объекте и распечатывать каждый год и его количество, сколько хотите.

...