到 Firestore 内联编辑器的对话流 javascript:对 collection 的不同参数进行排序和过滤

Dialogflow to firestore inline editor javascript: sorting and filtering on different parameters of collection

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

根据 Dialogflow 中的输入,我需要 return 两个不同的东西。第一件事是 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 中的 collection。 下面的代码是我对我想要return的第二件事的解决方案,这就是我卡住的地方。不可能像我一样对两个不同的字段进行过滤和排序。但一定有办法解决这个问题 - 这是我想做的一件非常简单的事情。

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 (在任一降序或升序——不关心是否相等),以及集合范围。