NodeJS 子字段的Firestore复合索引

332nm8kg  于 2023-06-22  发布在  Node.js
关注(0)|答案(1)|浏览(116)

我正在使用Firestore构建一个应用程序,遇到了一个涉及子字段的查询问题。
我添加了一个搜索功能,允许用户根据各种标准过滤文章,比如年份、季节、流派和工作室。
为了实现这个特性,我使用了一个Firestore数据库和一个查询函数,该函数接受搜索词和过滤器作为输入,并返回匹配文章的列表。
具体来说,我试图查询文档的genres和studios子字段,但是当我运行查询时,我得到一条错误消息,内容是:
Firebase错误:查询需要索引。
我创建了一个函数来生成查询,然后在getData(q)函数中使用它。

export function generateSearchQuery(
  searchTerms: string,
  filters: {
    year: number | "";
    season: string;
    genre: string;
    studio: string;
  }
): Query<DocumentData> {
  const docRef = collection(firestore, "example");
  let q = query(docRef);

  if (searchTerms) q = query(q, where("title", "==", searchTerms));
  if (filters.year) q = query(q, where("year", "==", filters.year));
  if (filters.season) q = query(q, where("season", "==", filters.season));
  if (filters.genre) q = query(q, where(`genres.${filters.genre}`, "==", true));
  if (filters.studio)
    q = query(q, where(`studios.${filters.studio}`, "==", true));

  q = query(q, orderBy("id", "desc"), limit(20)); //id is needed, for fetching more by using startAfter() function 

  return q;
}

我认为这是不可能的,以创造复合指数与工作室和流派,因为有无限的模式,例如。类型。动作类型。喜剧等等。
例如,

"studios": {
        "Studio A": true,
        "Studio B": true,
        "Studio C": true
      },
      "genres": {
        "Action": true,
        "Comedy": true,
        "Drama": true,
        "Sci-Fi": true
      }

有人能帮我弄清楚如何创建我需要的综合指数吗?任何帮助将不胜感激。谢谢你!

g6baxovj

g6baxovj1#

我只发现了这个方法,
创建一些合并关键字
虚拟示例

const arr1 = ["apple", "banana", "orange"];
const arr2 = ["happy", "sad", "angry"];

生成一些关键字,创建一个新的项目“关键字”来存储这个arr。

function combineArrays(arr1, arr2) {
  const combinedArr = [...arr1, ...arr2];

  for (const item1 of arr1) {
    for (const item2 of arr2) {
      combinedArr.push(`${item1}, ${item2}`);
    }
  }

  return combinedArr;
}

生成目标

function combineValues(value1, value2) {
  let combinedValue = "";

  if (value1) {
    combinedValue += value1;
  }

  if (value1 && value2) {
    combinedValue += ", ";
  }

  if (value2) {
    combinedValue += value2;
  }

  return combinedValue;
}

const target = combineValues(filters.genre, filters.studio)

最后,

where("keywords", "array-contains", target)

相关问题