[英]Firebase-admin Firestore node.js share logic with modular v9 js sdk
[英]Firestore Query Documents With Similar Array (Node.js/Admin SDK)
想象一下你有这个数组
[10.3, 14, 12.4, 3.5]
在您的数据库中,您还有两个带有 arrays 的文档:
First document -> [10, 13.1, 0, -10]
Second document -> [0, 0, 0, 0]
现在想象一下,您有 +1000000 个具有相同两个 arrays 的文档(在每个文档之间交替)...有没有办法获取与当前数组具有相似值的所有文档?
我的意思是,像这样:
...
.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()
的参数,以增加或降低比较的容忍度
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.