我有一个像这样的Firestore文档数据:
UsersData: {
a1234sdffsdf: {
avatarUrl: 'xxxxxx',
id: 'qwe234234',
name: 'larry',
status: 'online'
},
u1ty4sdff09k: {
avatarUrl: 'xxxxxx',
id: 'abc123456',
name: 'stephen',
status: 'online'
}
}
我想循环遍历两个对象(
a1234sdffsdf
和u1ty4sdff09k
)以找到与用户id匹配的id
属性并将状态更新为'offline'
。如何使用 firebase v9 实现此功能?
collection: chatrooms
document: randomid
data: UsersData
const chatroomQuery = query(collection(db, 'chatrooms', where(loop through UsersData and find id, '==', user.id)
updateDoc(chatroomQuery, { status: 'offline' })
有人可以帮我吗?非常感谢您的帮助🙏
确实没有办法按照您所布置的方式进行查询。您正在尝试查询“具有字段
UserData.${some_id}
的文档”。但 Firestore 查询是关于字段中的值,而不是关于字段的存在。
一种选择是在每个文档中创建一个单独的字段,仅包含该文档中的用户 ID(我们称之为
userIds
)并针对该字段进行查询。
因此文档可能如下所示:
{
UsersData: {
a1234sdffsdf: {
avatarUrl: 'xxxxxx',
id: 'qwe234234',
name: 'larry',
status: 'online'
},
u1ty4sdff09k: {
avatarUrl: 'xxxxxx',
id: 'abc123456',
name: 'stephen',
status: 'online'
}
},
userIds: ['a1234sdffsdf', 'u1ty4sdff09k']
}
然后查询将是:
const chatroomQuery = query(collection(db, 'chatrooms',
where('userIds', 'array-contains', user.id))
const chatroomSnap = await getDocs(chatroomQuery);
if (chatroomSnap.size === 1) {
const chatroomRef = chatroomSnap.docs[0].ref;
await updateDoc(chatroomRef, ........);
} else if (chatroomSnap.size > 1) {
console.log("Got more than one chatroom....now what?");
} else {
console.log("no chat rooms found");
}
您可能还想重新考虑
UserData
的数据结构。就具有可变键名称而言,使用起来有点尴尬……这在技术上是可行的,但会导致一些不太简单的编码。
阅读一些有关设计 Firestore 集合和文档的文章可能会让您受益匪浅,例如这个。
注意:您的原始代码未正确将 DocumentReference 传递给
updateDoc()
。您向它传递了一个查询,这是行不通的。