javascript - 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.');
});
}
解决方案
假设正如您所说,db
是一个集合对象,您的查询对于 Firestore 是有效的。
db.orderBy('Date', 'desc').where('Country', '==', 'France').limit(3);
Firestore 确实允许跨多个字段进行查询,假设唯一orderBy
或范围查询位于同一字段上。因此,您的查询是有效的(不同字段上的一个orderBy
和一个非范围where
)。
你没有提到你得到了什么错误,但我怀疑是这个(通常在 Javascript 控制台中可见):
查询需要索引。你可以在这里创建它:(网址)
这是因为这是一个需要复合索引的查询——它对一个字段进行排序并在另一个字段上进行过滤。
因此,要解决此问题,您只需要创建索引。在理想情况下,您只需单击该错误消息中的 URL 并被带到 Firebase 控制台中的确切位置以创建您需要的确切索引。如果由于某种原因您需要手动创建它,您也可以通过控制台来完成。完成构建后,您的查询应该可以工作。
在这种情况下,您将需要为db
所指向的任何集合创建一个索引,其中包含字段Date
(按降序排列)和Country
(按降序或升序排列——相等性无关紧要)以及集合范围。
推荐阅读
- protractor - 如何通过量角器上传csv文件
- node.js - 如何使用 Elastic Search for Node.js 搜索属性?
- php - Laravel Dusk 管道测试中的 404
- python-3.x - PyInstaller 到 lunx 中的可执行文件,给出:运行 upx -v 时出错?
- javascript - 将对象数组转换为特定格式?
- python - 在 Django ORM 中获取相关模型计数的有效方法
- vue.js - 在我的 vue 项目中使用 websocket 时遇到问题
- javascript - 如何在 Angular 材料中以 datepicker 的格式显示正确的日期
- spring - CouchbaseException:使用计数器时的 INVALID_ARGUMENTS
- android - 如何在 Mpandroidchart 折线图中的 xAxis 上设置标签?