首页 > 解决方案 > Dialogflow 到 Firestore 内联编辑器 javascript:对集合的不同参数进行排序和过滤

问题描述

我在 Google Cloud Firestore 中有一个数据库,其中包含一组文档,每个文档都包含以下参数:国家、标题、URL、日期。

我需要根据 Dialogflow 中的输入返回两个单独的内容。第一个是3条最新消息的头条,第二个是法国3条最新消息的头条。我将在 Dialogflows 内联编辑器(即 javascript)中执行此操作,但它似乎与 Node.js 中的 javascript 并不完全相同。

我已经用下面的代码解决了第一个问题:

function TopNews_Global(agent) {
      agent.add('Here are the latest Global news');

      let documents = db.orderBy('Date', 'desc').limit(3);      
    return documents.get()
      .then(snapshot => {
    snapshot.forEach(doc => {
          agent.add('-' + doc.data().Headline + '.');
          agent.add('Link:(' + doc.data().URL + ')');
        });
        return Promise.resolve('Read complete');
      }).catch(() => {
        agent.add('Error reading entry from the Firestore database.');
      });
  } 

db我在 Firebase 中的收藏在哪里。以下代码是我要返回的第二件事的解决方案,这就是我卡住的地方。无法像我一样对两个不同的字段进行过滤和排序。但必须有办法解决这个问题——这是我想做的一件非常简单的事情。

https://firebase.google.com/docs/firestore/manage-data/export-import

function TopNews_France(agent) {
      agent.add('Here are the latest French news');

      let documents = db.orderBy('Date', 'desc').where('Country', '==', 'France').limit(3);       
    return documents.get()
      .then(snapshot => {
    snapshot.forEach(doc => {
          agent.add('-' + doc.data().Headline + '.');
          agent.add('Link:(' + doc.data().URL + ')');

        });
        return Promise.resolve('Read complete');
      }).catch(() => {
        agent.add('Error reading entry from the Firestore database.');
      });
  }

标签: javascriptgoogle-cloud-firestoredialogflow-es-fulfillment

解决方案


假设正如您所说,db是一个集合对象,您的查询对于 Firestore 是有效的。

db.orderBy('Date', 'desc').where('Country', '==', 'France').limit(3);

Firestore 确实允许跨多个字段进行查询,假设唯一orderBy或范围查询位于同一字段上。因此,您的查询是有效的(不同字段上的一个orderBy和一个非范围where)。

你没有提到你得到了什么错误,但我怀疑是这个(通常在 Javascript 控制台中可见):

查询需要索引。你可以在这里创建它:(网址)

这是因为这是一个需要复合索引的查询——它对一个字段进行排序并在另一个字段上进行过滤。

因此,要解决此问题,您只需要创建索引。在理想情况下,您只需单击该错误消息中的 URL 并被带到 Firebase 控制台中的确切位置以创建您需要的确切索引。如果由于某种原因您需要手动创建它,您也可以通过控制台来完成。完成构建后,您的查询应该可以工作。

在这种情况下,您将需要为db所指向的任何集合创建一个索引,其中包含字段Date(按降序排列)和Country(按降序或升序排列——相等性无关紧要)以及集合范围。


推荐阅读