我有'users'
集合,其中包含每个用户ID的文档。我还使用经过身份验证的用户ID(匿名登录)将当前用户ID存储在userID
变量中。
我需要根据最小值(此集合中的文档数据项)的计数器获得一个文档ID(而非文档数据),并将其存储在名为“ receiverID”的变量中,但是如果文档ID等于当前用户的ID,那么我想获取下一个可用ID。
例如,如果我的平台上有3个用户(A,B和C),并且存在以下“计数器”值:
理论上,当A查询集合时,他们将获得自己的文档ID。然后,我需要在“用户”集合中获得第二个文档。
我从以下内容开始,但陷入困境:
receiverID = db.collection('users').orderBy('Questions Received','asc').limit(1)
此外,这是在事件侦听器上触发的(当用户提交问题时),因此必须在函数的下一部分之前解析“ receiverID”。这是我的事件监听器的样子:
const sayForm = document.querySelector('#say-form');
sayForm.addEventListener('submit', (e) => {
e.preventDefault();
db.collection('message').add({
message: sayForm.sayInput.value,
time: firebase.firestore.FieldValue.serverTimestamp(),
sender: userID,
currentReceiver: receiverID,
received: 1
})
.catch(function(error) {
console.error("Error adding document: ", error);
});
});
答案 0 :(得分:1)
Firestore中没有不同的查询运算符,因此您必须获取第一个文档,如果不是预期的documentID,则获取下一个文档,依此类推。您可以通过执行以下操作来做到这一点:
receiverID = this.getNextReceiver();
function getNextReceiver() {
db.collection('users')
.orderBy('Questions Received','asc')
.limit(1)
.get()
.then(function (doc) {
if(doc.id == userID){
var validId = false;
var tempDoc = doc;
while(!validId){
db.collection('users')
.orderBy('Questions Received','asc')
.startAfter(tempDoc)
.limit(1)
.get()
.then(function (newDoc) {
if(newDoc.id != userID){
validId = true;
return newDoc.id;
}
tempDoc = newDoc;
});
}
}
return doc.id;
});
}
所有这些都同步运行。对于您的提交,由于事件触发了ReceiverID,因此不能保证会填充该ID,因此您必须创建一个不填充该值的方案,或者阻止用户交互,直到填充它。
注意:所有这些代码都未经测试,但对于您来说应该是一个很好的起点。
答案 1 :(得分:1)
我能够通过执行以下操作来解决它:
<input type="button" value="button 20">
<input type="text" value="text 20">
通过将搜索结果限制为2并将其保存在变量中,我可以与“ userID”进行比较,并相应地将“ receiverID”设置为不匹配的结果。