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