在云数据库中构建基于标签的获取数据库的最佳方式是什么



我对如何构建文档感到困惑,以便在需要时通过标记有效地搜索/获取项目。

意思是,每个文档的结构如下:

{
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一起使用,您可以更好地支持通过标记进行过滤,这样您就不必像前面提到的那样使用映射而不是数组。

最新更新