我正在尝试通过云功能从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);
});
});
运行代码时,将检索所有项目,即使那些时间戳小于截止值的项目以及没有创建字段的项目也是如此。 有什么建议可以解决该问题吗?
我尝试通过在endAt之前添加startAt(“”)来删除没有创建字段的项目,如下所示: Firebase, query with "a child exists" as a condition?
const oldItemsQuery = ref.orderByChild('creation')startAt("").endAt(cutoff);
这样做我在查询响应中没有结果。
答案 0 :(得分:0)
更改此:
const oldItemsQuery = ref.orderByChild('creation').endAt(cutoff);
对此:
const oldItemsQuery = ref.orderByChild('creation').equalTo(cutoff);
创建一个包含与指定值匹配的子项的查询。
使用
startAt()
,endAt()
和equalTo()
使我们可以为查询选择任意起点和终点。