【发布时间】:2022-01-21 06:27:04
【问题描述】:
我正在构建一个项目,并且在这个项目中我进行了一对一的聊天。每个聊天都使用来自 firebase 的实时数据库存储(我在这里使用 react-native-firebase 库)。
我们有类似的东西:chat/{currentUserID}/{userID} 然后消息存储在这里并使用自动生成 ID 的 push() 方法发送到数据库。
基本上我要做的是通过删除超过 7 天前的任何消息来进行一些清理。 我已经有了这方面的逻辑,我在这里为我的应用程序的另一部分做这件事:
const randomTestTimerDB = Date.now() - 1
admin.database()
.ref('/publicChat')
.orderByChild('timestamp')
.endAt(randomTestTimerDB)
.once('value')
.then((snapshot) => {
snapshot.forEach((snap) => {
snap.ref.remove()
})
})
这很好用。但是我的问题是我正在使用云功能来做到这一点,所以我无法按照我的树来访问它们,因为它们嵌套在我没有从那里获得的 ID 的下方和下方。
知道在聊天集合中我们可以找到所有已经发送消息的用户。还知道每个这些都包含来自 currentUser 与之交互的所有用户的文档 (userID),并且在每个这些文档下方,附加到 userID 文档,我们最终拥有这两个用户之间共享的所有消息。
我尝试使用不同的方式联系他们,例如直接在 forEach 方法中调用数据库以对每个的 snapshot.id 进行分级,然后可能获取 child().val(),但它似乎不起作用。
这是我到目前为止所尝试的代码:
admin.database()
.ref('/chat')
.once('value')
.then((snapshot) => {
snapshot.forEach((snap) => {
if(snap.child().val().timestamp <= randomTestTimerDB) {
snap.ref.remove()
}
})
})
admin.database()
.ref('/chat')
.once('value')
.then((snapshot) => {
snapshot.forEach((snap) => {
admin.database().ref(`/chat/${snap.id}`).orderByChild('timestamp').endAt(randomTestTimerDB).once('value').then((snp) => {
snp.forEach((eachSnp) => {
eachSnp.ref.remove()
})
})
})
})
如何以最简单的方式获取这些嵌套消息?如果这是可能的,或者我应该考虑另一种方法来存储和组织我的数据树以使其更容易?
感谢您的帮助!
【问题讨论】:
-
您的代码查询
publicChat,但您共享的 JSON 中不存在此类节点。应该是chat? -
"我尝试使用不同的方式联系他们,例如在 forEach 方法中直接调用数据库以对每个的 snapshot.id 进行分级,然后可能会获取 child().val() 但它没有st 似乎有效”您可以编辑您的问题以显示您尝试过的代码吗?
标签: javascript firebase react-native firebase-realtime-database google-cloud-functions