Google cloud firestore DocumentReference#onSnapshot事件在添加数据时触发,即使它没有';与查询不匹配

Google cloud firestore DocumentReference#onSnapshot事件在添加数据时触发,即使它没有';与查询不匹配,google-cloud-firestore,vuejs2,Google Cloud Firestore,Vuejs2,我在firestore中有一个“用户”集合。每个文档都有一个用户名作为其密钥,并在其中包含一个名为“通知”的集合 下面的代码在应用程序加载时运行,大概是设置了一个事件侦听器来检测何时发生更改 const notificationRef=this.$db.collection(USERS).doc(this.currentUser().userName).collection(“通知”); 通知参考 .onSnapshot(快照=>{ snapshot.docChanges().forEach(更

我在firestore中有一个“用户”集合。每个文档都有一个用户名作为其密钥,并在其中包含一个名为“通知”的集合

下面的代码在应用程序加载时运行,大概是设置了一个事件侦听器来检测何时发生更改

const notificationRef=this.$db.collection(USERS).doc(this.currentUser().userName).collection(“通知”);
通知参考
.onSnapshot(快照=>{
snapshot.docChanges().forEach(更改=>{
开关(更改类型){
“添加”案例:
案例“修改”:
log(“检测到新的或更新的通知:”,change.doc.data());
这个.$store.commit(“setNotification”,{key:change.doc.id,…change.doc.data()});
打破
“删除”案例:
log(“检测到已删除通知:”,change.doc.data());
这是.$store.commit(“removeNotification”,change.doc.id);
打破
违约:
打破
}
});
这是.$forceUpdate();
});
下面是我如何向数据库添加通知的

异步发送邀请(){
var invitedMembers=[];
var notinvested=[];
var batch=this.$db.batch();
const userQuery=this.$db.collection(USERS).where('email','in',Object.values(this.data));
//我们必须对此“等待”,以便使用批写入
等待用户查询
.get()
。然后(快照=>{
snapshot.forEach(doc=>{
//确保我们不邀请当前用户!
如果(doc.data().email!==this.currentUser().email){
推送(doc.data().email);
const currentUser=this.currentUser();
batch.set(doc.ref.collection('notifications').doc(){
text:`邀请您加入“${this.currentGroup.value.name}”`,
行动:“邀请”,
作者:{
用户名:currentUser.userName,
displayName:currentUser.displayName,
photoURL:currentUser.photoURL
},
组:this.currentGroup.key
});
}
});
});
batch.commit()。然后(()=>{
Object.values(this.data).forEach(value=>{
如果(!invitedMembers.includes(值)){
如果(值!==“”){
未邀请。推送(值);
}
}
});
log(“受邀成员:”,受邀成员);
log(“未邀请:”,未邀请);
如果(notinvested.length>0){
this.errors.notinvested=`找不到以下成员且未被邀请:${notinvested}`;
}
});
}
情景:

当前用户:凯伦

通知添加到:tyner

问题是,如果我在kylon当前登录时向tyner添加通知,该通知将显示为添加,因此将显示到kylon的前端(仅在最初,当我重新加载页面时,它将加载到正确的文档)。 我已经检查了firestore,它保存在正确的位置(“users/tyner/notifications/”)

由于我正在使用当前用户的用户名“kylon”查询用户文档,我假设firestore只提供满足该条件的快照,但事实并非如此


有人能解释一下为什么会发生这种情况吗?

如果您删除所有变量,按用户的实际UID(而不是“a”和“B”)调用用户,并准确显示您为向特定集合添加数据所做的操作,那么调试就会容易得多。你现在拥有的东西太抽象了,不容易处理。现在编辑,谢谢。我试着尽可能多地添加。如果您认为还有其他帮助,请告诉我。我可以通过将通知作为顶级集合移动来解决此问题。我不知道为什么这样做有效,但观看嵌套集合却不行。我仍然很想知道是否有人对此有答案。这几乎就像在(用户//通知)上放置快照实际上是在监视(用户)任何更改。在子集合上放置快照侦听器肯定不会对任何其他集合中的文档产生更改,即使是父文档。