Я пытаюсь отфильтровать некоторые данные из базы данных 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);
При этом у меня нет результатов в ответе на запрос.