我对如何构建文档感到困惑,以便在需要时通过标记有效地搜索/获取项目。
意思是,每个文档的结构如下:
{
name: "Delicious blackforest cake",
tags: ["blackforest","birthday","designer"]
...
}
{
name: "Red velvet cake",
tags: ["party","anniversary","designer"]
...
}
...
一共有32个标签,我想根据标签取蛋糕。这是我目前的结构,我觉得在获取时效率会很低。
我想根据标签和蛋糕的名称进行搜索,例如
如果我搜索de
,搜索建议应该是:
- 设计师蛋糕
/* This is based on a tag */
- 美味黑森林蛋糕
/* This is based on an actual name */
据我所知,我想这在Firebase中很难实现。我应该选择MongoDB还是应该更改文档的结构?
我想要一个建议,以有效地搜索和获取根据我的上述需求。
Firestore可以用于此用例。array-contains
运算符可用于查询tags
数组中包含特定值的文档。
await colRef.where("tags", "array-contains", "tag")
如果您的用例需要查找具有多个标记的文档,那么您可能必须使用映射而不是数组。Checkout Firestore搜索数组包含多个值。
MongoDB有一个$all
操作符,可以用于此操作,如下所示:
await collection.find({ tags: { $all: ["tag"] } })
对于全文搜索,您必须使用文档中提到的搜索服务才能获得最佳结果。尽管MongoDB有一个$search
操作符(据我所知,它使用的是ApacheLucene(,但只有当您在Atlas上托管数据库时才能使用,否则您将不得不依赖$text
操作符。Firestore Algolia Extension应该为您完成大部分工作,并让您使用Algolia的所有全文搜索功能。
此外,如果您将Algolia与Firestore一起使用,您可以更好地支持通过标记进行过滤,这样您就不必像前面提到的那样使用映射而不是数组。