javascript - Dialogflow 到 firestore 内联编辑器 javascript : sorting and filtering on different parameters of collection

标签 javascript google-cloud-firestore dialogflow-es-fulfillment

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

我需要根据 Dialogflow 中的输入返回两个单独的内容。第一个是最新 3 条新闻的头条,第二条是法国最新 3 条新闻的头条。 我要在 Dialogflows 内联编辑器(即 javascript)中执行此操作,但它似乎与 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.');
      });
  }

最佳答案

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

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

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

您没有提及您遇到的错误,但我怀疑是这样的(名义上在 Javascript 控制台中可见):

The query requires an index. You can create it here: (url)

那是因为这是一个 query which requires a composite index -- 它对一个字段进行排序并在另一字段进行过滤。

因此,要解决此问题,您只需创建索引即可。在理想情况下,您只需单击该错误消息中的 URL 即可转到 Firebase 控制台中的确切位置,以创建您需要的确切索引。如果由于某种原因您需要手动创建它,您也可以这样做 through the console 。完成构建后,您的查询应该可以运行。

在这种情况下,您需要为db指向的任何集合创建一个索引,其中包含字段Date(按降序排列)和Country (无论是降序还是升序——相等性并不重要),并且具有集合范围。

关于javascript - Dialogflow 到 firestore 内联编辑器 javascript : sorting and filtering on different parameters of collection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58954599/

相关文章:

javascript - Elasticsearch 在 Jasmine 测试中没有按时索引

javascript - 将变量从 JS 发布到 PHP 时遇到问题

javascript - 根据需要表单验证链接字段

java - 如何使用 Hashmap 在 firebase firestore android 中添加 Map<String, Object> 元素?商店数据库

javascript - Firebase 实时数据库第一个查询没有响应

dialogflow-es - 在 Dialogflow-Kommunicate 聊天机器人中使用一次后隐藏快速响应选项

javascript - 在 JS 中弹出窗口最可靠的方法是什么?

firebase - Cloud firestore 中一个文档或一个字段是否按一次读取收费?

node.js - 未处理的拒绝: Headers cant be set after they are sent

google-cloud-platform - Webhook 调用失败 : URL_REJECTED error in DialogFlow v2 Fulfillments