繁体   English   中英

Firestore 查询具有相似数组的文档(Node.js/Admin 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM