繁体   English   中英

在 Firestore 文档中进行研究

[英]Do a research in a Firestore document

在我的“用户”集合中,每个用户都由他们的姓名、爱好列表和技能来定义:

“用户”中文档的结构:

name : "Name"
hobbies: ["hobby1","hobby2","hobby3"]
skills: ["skill1","skill2","skill3"]

我想要的是:获取集合中其中一个字段包含特定单词的所有文档。 问题是目前我得到了所有文件,然后我做了一个循环来保留匹配的文件。 但我宁愿做一个查询(读取很昂贵)。 所以我想像这样重新组织文档:

新结构:

data: ["Name","hobby1","hobby2","hobby3",skill1","skill2","skill3"]

所以我可以使用“where”和“array-contains”进行查询。 你怎么认为? 是不是很奇怪?

正如我从您的评论中了解到的那样,您基本上需要执行连续搜索。 您需要在 hobbies array中搜索特定单词,如果没有得到任何结果,则需要在skills数组中执行另一次搜索以查找完全相同的单词,如果您再次没有得到任何结果,您需要搜索名称。

由于您没有指定特定的编程语言,我假设您使用的是 Flutter,就像您的其他问题一样。 因此,我将尝试真正快速地解释如何去做。

首先,您需要创建以下查询:

final queryHobbiesByWord = users.where("hobbies", arrayContains: "word");

然后你必须调用get() 一旦回调成功,您必须检查 QuerySnapshot 中存在的文档数是否大于零。 如果是,则执行您想要的逻辑,否则,在回调中创建另一个如下所示的查询:

final querySkillsByWord = users.where("skills", arrayContains: "word");

做与 about 完全相同的事情。 如果 QuerySnapshot 中存在的文档数大于零,则执行您想要的逻辑,否则,在回调中创建另一个查询,如下所示:

final queryNameByWord = users.where("name", isEqualTo: "word");

再次执行与上述相同的操作,仅此而已。 不要忘记在前一个回调中执行每个操作。

如果您想在爱好技能之间使用OR语句,则不能使用使用array-contains的查询。 如本文档所述:

每个查询最多可以使用一个 array-contains 子句。 您不能将 array-contains 与 array-contains-any 结合使用。

我的建议是将技能和爱好合二为一:例如:

name : "Name"
skillsandhobbies : ["Hobby1", "Hobby2", "Hobby3", "Skill1", "Skill2", "Skill3"]

然后您可以使用此示例查询来获取所有具有包含特定单词的爱好或技能的文档:

const q = query(collection(db, "users"), where("skillsandhobbies", "array-contains", "specific-word"));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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