如何解决具有相似数组的Firestore查询文档Node.js / Admin SDK
想象你有这个数组
[10.3,14,12.4,3.5]
在您的数据库中,您还有两个带有这些数组的文档:
First document -> [10,13.1,-10]
Second document -> [0,0]
现在假设您有+1000000个文档,它们具有相同的两个数组(在每个数组之间交替)...有什么办法可以使所有具有与当前数组相似的值的文档?
我的意思是,像这样:
...
.where("array","isSimilar",yourArray)
.get()
这样我就可以得到所有具有数组的文档:
[10,-10]
还是唯一的方法是下载每个文档,而这可能真的很慢,然后迭代并搜索最相似的文档?我认为当谈论“相似点位置”,“用户失去相似体重的几周”,...
时,这真的很有趣。谢谢。
解决方法
目前,firestore不支持这种查询。因此,我建议您更新结构以包括用于数组比较的String字段。因此,每个文档如下所示:
{
array: [12,11,8,9],arrayStr: "12,9",...
}
您只需在所有现有文档上调用doc.array.join(",")
并将值保存到文档中即可实现此结构。
然后,可以使用firestore查询进行比较,如下所示:
const arrToCompare = [12,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,9"
然后您将像这样查询:
const arrToCompare = [12,arrToCompare.map(num => Math.round(num)).join(",")).get();
// Results would include arrays like [12.2,9.0]
...
当然,您可以更改传递给Math.round()
的参数,以提高或降低比较的容忍度
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。