今天,我注意到我的代码中有一个错误,在我的Firestore中,没有对重复的数据执行某些清理操作。
在不久前写这段代码时,我已经意识到对对象使用“array-converts”的挑剔本质。我知道它们需要有完全相同的形状。Firebase还按字母顺序插入所有带有键的对象(Maps),因此我甚至创建了一个辅助函数,以确保对象也按相同顺序具有键。
export type UserReference = {
name?: string;
uid: AppUser['uid'];
};
export const getUserRef = (user: AppUser | DbUser): UserReference => ({
name: user.name,
uid: user.uid,
});
现在在我的代码中,它仍然不起作用。。。
const linkedGroupQuery = getFirestore()
.collection(constants.dbCollections.groups)
.where('owners', 'array-contains', getUserRef(user));
...
const querySnapshot = await linkedGroupQuery.get();
querySnapshot.forEach((doc) => {
const linkedGroup = doc.data() as DbGroup;
const owners = linkedGroup.owners.filter((o) => o.uid !== uid);
batch.update(doc.ref, { owners });
});
我可以在我的Firebase面板中看到,记录按预期插入,但此清理代码不起作用。
同时,我有一个非常相似的代码,它确实有效:
const groupRef: GroupReference = getGroupRef(group);
const batch = getFirestore().batch();
const usersWithGroup = await getFirestore()
.collection(constants.dbCollections.users)
.where('groups', 'array-contains', groupRef)
.get();
// Remove group from all users
usersWithGroup.forEach((userSnapshot) => {
const userData = userSnapshot.data() as DbUser;
const userGroups = userData.groups?.filter((g) => g.id !== group.id);
batch.update(userSnapshot.ref, { groups: userGroups });
});
这里可能发生了什么?
编辑:
事实证明,这是异步/等待和批处理写入的问题,而不是“数组包含”的问题