如何获取包含字符串的数组的文档? Cloud Firestore和云功能

时间:2018-07-27 15:57:07

标签: javascript firebase google-cloud-firestore google-cloud-functions

所以我在网上到处都看过,但似乎无法弄清楚如何使它生效。

我要实现的目标是找到在其设备下具有相同设备的所有用户。 这是Firestore数据库的结构: Database Image

因此,Firebase最近发布了其Javascript库的5.3.0版本,其发行说明中指出:

  

添加了与“ .where()”一起使用的“数组包含”查询运算符,以查找其中数组字段包含特定元素的文档。

Firebase Javascript Release Notes

我正在尝试在.where()中使用此“数组包含”,但没有成功。这是我的代码:     admin.firestore().collection("users").where("devices",'array-contains', id) //I get id from another place, i know that id is valid

这是我从firebase函数日志中得到的错误:

  

未处理的错误错误:参数“ opStr”不是有效的FieldComparison。运算符必须为“ <”,“ <=”,“ ==”,“>”或“> =”之一。       在Object.exports。(匿名函数)[as isFieldComparison](/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/validate.js:89:23)       在CollectionReference.where(/user_code/node_modules/firebase-admin/node_modules/@google-cloud/firestore/build/src/reference.js:1095:18)       在exports.checkIfDeviceIdValid.functions.https.onCall(/user_code/index.js:23:50)       在/user_code/node_modules/firebase-functions/lib/providers/https.js:330:32       在下(本机)       在实现(/user_code/node_modules/firebase-functions/lib/providers/https.js:25:58)       在process._tickDomainCallback(internal / process / next_tick.js:135:7)

这是我package.json中的依赖项:

"dependencies": {
"@google-cloud/firestore": "^0.15.4",
"firebase-admin": "~5.13.0",
"firebase-functions": "^2.0.2"
}

如果有人可以帮助我,并向我展示如何执行此操作的示例,我将不胜感激。谢谢。

4 个答案:

答案 0 :(得分:3)

Doug在其评论中已经暗示了答案-您正在使用的adminSDK尚不支持array-contains。 adminSDK与JavaScriptSDK有所不同...这肯定会造成混淆,因为您使用JS语言来利用adminSDK。 This release-notes page很好地证明了它们是两个独立的事实。

  • JavaScript SDK用于前端。
  • 管理SDK用于后端(通常是FB云功能)。

不幸的是,没有一种干净的方法可以完成您在后端所要寻找的东西。如果您在前端进行操作,则可以使用JavaScript SDK团队刚刚推出的便捷array-contains功能。如果您必须在后端执行此操作,那么除了痛苦地查询整个内容并遍历值之外,我别无选择。

对于这种讨厌的方法,有几种选择:

  1. 如果可以,将该查询移至前端,并利用JS-SDK的新array-contains功能。

  2. 重组数据库以避免使用数组。

  3. (不是一个严肃的选择),等待adminSDK团队实施此功能。

答案 1 :(得分:3)

如Doug和JeremyW所述,此功能未在adminSDK上实现。您可以通过使设备阵列成为与用户集合相同级别的集合来重组数据库。该集合中的每个文档都将包含设备编号和用户ID。然后,您可以查询所需的信息:

const ids = admin.firestore().collection("devices").where("number",'==', id).select("id").get();
ids.forEach(id =>{
    admin.firestore().collection("users").doc(id)...
});

您可以从Frank Firebase query if child of child contains a value

的答案中获得更多想法

答案 2 :(得分:2)

Firebase Admin Node.js SDK的

Version 6.0.0 - August 9, 2018具有array-contains功能。

答案 3 :(得分:0)

使用以下配置,包含数组的运算符可以正常工作:

"firebase-admin": "8.0.0",
"firebase-functions": "^2.3.1",

"engines":
    "node": "8"