gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 16:09:46 24 4
gpt4 key购买 nike

假设你有这个数组

[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 不支持这种查询。因此,我建议您更新结构以包含用于数组比较的 String 字段。所以每个文件看起来像这样:

{
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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com