javascript - Firestore 查询具有类似数组的文档 (Node.js/Admin SDK)

标签 javascript firebase google-cloud-platform google-cloud-firestore

假设你有这个数组

[10.3, 14, 12.4, 3.5]

在您的数据库中,您还有两个包含这些数组的文档:

First document -> [10, 13.1, 0, -10]
Second document -> [0, 0, 0, 0]

现在想象一下,您有超过 1000000 个文档,它们具有相同的两个数组(每个数组之间交替)...有没有办法获取与当前数组具有相似值的所有文档?

我的意思是,像这样:

   ...
   .where("array", "isSimilar", yourArray)
   .get()

这样我就可以获得所有包含该数组的文档:

[10, 13.1, 0, -10]

或者唯一的方法是下载每个文档,这可能非常慢,然后迭代并搜索最相似的文档?我认为当谈论“相似的点位置”、“用户失去相似体重的周数”时,这真的很有趣......

谢谢。

最佳答案

目前,firestore 不支持此类查询。因此,我建议您更新结构以包含用于数组比较的字符串字段。因此每个文档将如下所示:

{
   array: [12, 11, 8, 9],
   arrayStr: "12,11,8,9",
   ...
}

您只需在所有现有文档上调用 doc.array.join(",") 并将值保存到文档即可实现此结构。

然后,就可以与 firestore 查询进行比较,如下所示:

const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.join(",")).get();
...

更新:要通过相似性而不是相等进行比较,一种可能的方法是在创建过程中将“相似性”逻辑应用于 arrayStr 字段。例如,如果您希望容忍小于 0.5 的差异,则可以在保存为字符串之前对数组元素使用 Math.round()。就像这样:

const array = [12.2, 10.7, 8.111, 9.0];
const arrayStr = array.map(num => Math.round(num)).join(","); //"12,11,8,9"

然后你将这样查询:

const arrToCompare = [12, 11, 8, 9];
const snapshot = await firestore().collection(collection).where("arrayStr", "==", arrToCompare.map(num => Math.round(num)).join(",")).get();
// Results would include arrays like [12.2, 10.7, 8.111, 9.0]
...

当然,您可以改变传递给 Math.round() 的参数,以增加或减少比较的容忍度

关于javascript - Firestore 查询具有类似数组的文档 (Node.js/Admin SDK),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63432304/

相关文章:

javascript - 如何用js从json中赋值

Firebase 本地服务器

android - 从GCM迁移到FCM后的PeriodicTask和OneoffTask

joomla - 谷歌云平台: Temporary Server error?

javascript - AngularJS 不显示 MySQL 结果 *已编辑

javascript - 在其他任务完成后运行 gulp 任务

javascript - Node : Find mailto: section with cheerio

ios - Firebase Pod 代码更改

google-cloud-platform - 如何批量加载从其他来源生成的自定义 Avro 数据?

google-cloud-platform - 如何删除我的谷歌云平台计费账户?