如何从Firebase集合中获取第一个文档ID,该ID不等于给定的ID?

时间:2020-06-30 02:09:10

标签: javascript firebase asynchronous google-cloud-firestore

我有'users'集合,其中包含每个用户ID的文档。我还使用经过身份验证的用户ID(匿名登录)将当前用户ID存储在userID变量中。

我需要根据最小值(此集合中的文档数据项)的计数器获得一个文档ID(而非文档数据),并将其存储在名为“ receiverID”的变量中,但是如果文档ID等于当前用户的ID,那么我想获取下一个可用ID。

例如,如果我的平台上有3个用户(A,B和C),并且存在以下“计数器”值:

  • A:1,B:2,C:3

理论上,当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);
    });
});

2 个答案:

答案 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”设置为不匹配的结果。