Проблемы с фильтрацией данных в базе данных Firebase - PullRequest
0 голосов
/ 05 июля 2018

Я пытаюсь отфильтровать некоторые данные из базы данных Firebase в облачной функции. Эти данные выглядят так:

"items": {
    "id1": {
        "status": {
            "creation": timestampValue,
            "status": "initialized"
        },
        "data" : data1
    }
    "id2": {
        "status": {
            "status": "loaded"
        },
        "data" : data2
    },
    "id2": {
        "status": {
            "creation": timestampValue,
            "status": "loaded"
        },
        "data" : data
    },
    "id3": {
        "status": {
            "creation": timestampValue,
            "status": "ended"
        },
        "data" : data3
    }
}

Я хочу использовать фильтр на основе поля создания. Поле не всегда присутствует.

Мой код вдохновлен этим: https://github.com/firebase/functions-samples/blob/master/delete-old-child-nodes/functions/index.js

вот код, который я написал:

const CUT_OFF_TIME = 24 * 60 * 60 * 1000; // 24 Hours in milliseconds.

exports.cleanAfter24h = functions.database.ref('/items/{itemId}').onUpdate((change, event) => {
    const ref = change.after.ref.parent; // reference to the parent
    const now = Date.now();
    const cutoff = now - CUT_OFF_TIME;
    const oldItemsQuery = ref.orderByChild('creation').endAt(cutoff);
    return oldItemsQuery.once('value').then((snapshot) => {
        // create a map with all children that need to be removed
        const updates = {};
        snapshot.forEach(child => {
            let childData = child.val();
            if (childData.status.creation) {
                let elapsed = childData.status.creation - cutoff;
                if (elapsed <= 0) {
                    updates[child.key] = null;
                }
            } else {
                console.log(child.key + ' does not have a creation date');
            }
        });
        // execute all updates in one go and return the result to end the function
        return ref.update(updates);
  });
});

При выполнении кода извлекаются все элементы, даже те, которые имеют временную метку, меньшую, чем отсечка, и те, у которых нет поля создания. Любые предложения, как это исправить?

Я попытался удалить элементы, у которых нет поля создания, добавив startAt ("") перед endAt, как предлагается здесь: Firebase, запрос с "ребенком существует" как условие?

const oldItemsQuery = ref.orderByChild('creation')startAt("").endAt(cutoff);

При этом у меня нет результатов в ответе на запрос.

1 Ответ

0 голосов
/ 05 июля 2018

Изменить это:

const oldItemsQuery = ref.orderByChild('creation').endAt(cutoff);

в это:

const oldItemsQuery = ref.orderByChild('creation').equalTo(cutoff);

equalTo

Создает запрос, включающий дочерние элементы, соответствующие указанному значению.

Использование startAt(), endAt() и equalTo() позволяет нам выбирать произвольные начальные и конечные точки для наших запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...