假设你有这个数组
[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/