我想删除15天以上的数据。我可以同时查询和删除多个目录吗?
数据库结构是这样的。有多种语言和类型。
{
"hr" : {
"classic" : {
"finish" : {
"-MuJD4oAlQ42TkdfKW5M" : {
"gid" : "LlAHMyj",
"ts" : 6.652890289073215E8
}
}
},
"duel" : {
"finish" : {
"-MuJD4o9LONeayt4ACMC" : {
"gid" : "rfePU2x",
"ts" : 6.652890289073215E8
}
}
},
"target" : {
"finish" : {
"-MuJD4o9LONeayt4ACMD" : {
"gid" : "FBz4H_4",
"ts" : 6.652890289073215E8
}
}
}
},
"nl" : {
"target" : {
"finish" : {
"-MuJD4oAlQ42TkdfKW5L" : {
"gid" : "sv3pRfC",
"ts" : 6.652890289073215E8
}
}
}
}
}我试着用下面的代码来完成它,但是它总是返回null。
exports.deleteOldData = function (snap, context) {
const end = new Date(new Date().setDate(new Date().getDate() - 15));
const endDate = toSwiftDate(end);
database.ref("/matchTour/{language}/{type}/finish/").orderByChild("ts").endAt(endDate).transaction(function (info) {
if (info === null) return info;
console.log("matchTour 3", JSON.stringify(info.val()));
return null;
}).catch((error) => {
console.log("error);
});
};发布于 2022-01-25 20:39:08
您不能在查询上运行事务。事实上,从查询的参考文档来看,这甚至不应该编译。
这一点应该更接近:
exports.deleteOldData = function (snap, context) {
const end = new Date(new Date().setDate(new Date().getDate() - 15));
const endDate = toSwiftDate(end);
const ref = database.ref("/matchTour/{language}/{type}/finish/");
return ref
.orderByChild("ts").endAt(endDate)
.once("value")
.then((results) => {
let updates = {};
results.forEach((snapshot) => {
updates[snapshot.key] = null;
});
return ref.update(updates);
}).catch((error) => {
console.error(error);
});
};上面的结果从数据中读取查询的结果,执行一个多路径的更新来删除所有这些,并确保异步读写气泡返回的承诺,这样您的函数容器就不会过早终止。
这就引出了language和type在database.ref("/matchTour/{language}/{type}/finish/")中的位置问题。如果希望有来自上下文的变量,则需要对此字符串使用backticks:
database.ref(`/matchTour/{language}/{type}/finish/`)总之,这段代码中有相当多的错误,使我认为您可能还不太习惯编写服务器端JavaScript。如果是这样的话,编写云函数并不是最容易开始的方法,我建议您首先在客户端JavaScript环境中编写相同的代码,比如本地node.js脚本,甚至网页。
阅读面向Web开发人员的Firebase文档和/或参加Web开发人员的Firebase codelab是很好的起点。
https://stackoverflow.com/questions/70855277
复制相似问题