【问题标题】:firestore min max function not working in queryfirestore min max 函数在查询中不起作用
【发布时间】:2021-04-15 09:15:55
【问题描述】:

我得到了这个用于从我的数据库中过滤数据的 firestore 查询,但我的 min max 没有过滤掉我的最高价格。我不明白为什么。

else 功能不起作用 但是当我在else if 语句中测试查询时,min max 可以正常工作。

我的 GET 请求正文:

{
  "pageNumber": 1,
  "seller": "",
  "name": "shirt",
  "category": "Shirts",
  "min": 0,
  "max": 120,
  "rating": [ 3, 4 ],
  "order": "lowest"
}

我的代码:

const { admin, db } = require("../util/admin");
const config = require("../util/config");
const firebase = require("firebase");
const { data } = require("../data");

//get all products
let latestDoc = null;
exports.getAllProducts = (req, res) => {
  const limit = 4;
  const page = Number(req.body.pageNumber) || 1;
  const name = req.body.name || "";
  const category = req.body.category || "";
  const order = req.body.order || "";
  const min =
    req.body.min && Number(req.body.min) !== 0 ? Number(req.body.min) : 0;
  const max =
    req.body.max && Number(req.body.max) !== 0 ? Number(req.body.max) : 1000000;
  const rating = req.body.rating[0];

  const sortOrder =
    order === "lowest" ? "asc" : order === "highest" ? "desc" : "asc";
  const orderType =
    order === "newest"
      ? "createdAt"
      : order === "toprated"
      ? "rating"
      : "price";

  console.log(min);
  console.log(max);

  if (category === "" && rating === 0 && name === "") {
    console.log("geen filter");
    db.collection("products")
      .orderBy(orderType, sortOrder)
      .startAfter(latestDoc || 0)
      .limit(limit)
      .startAt(min)
      .endAt(max)
      .get()
      .then((doc) => {
        const sendData = doc.docs.map((data) => data.data());
        latestDoc = doc.docs[doc.docs.length - 1];
        res.send(sendData);
      });
  } else if (category === "" && rating > 0 && name === "") {
    console.log("products");
    db.collection("products")
      .where("rating", ">=", rating)
      .orderBy("rating")
      .startAfter(latestDoc || 0)
      .limit(limit)
      .startAt(min)
      .endAt(max)
      .get()
      .then((doc) => {
        const sendData = doc.docs.map((data) => data.data());
        latestDoc = doc.docs[doc.docs.length - 1];
        res.send(sendData);
      });
  } else if (category !== "" && rating === 0 && name === "") {
    console.log("category");
    db.collection("products")
      .where("category", "==", category)
      .orderBy(orderType, sortOrder)
      .startAfter(latestDoc || 0)
      .limit(limit)
      .startAt(min)
      .endAt(max)
      .get()
      .then((doc) => {
        const sendData = doc.docs.map((data) => data.data());
        latestDoc = doc.docs[doc.docs.length - 1];
        res.send(sendData);
      });
  } else if (name !== "" && category === "" && rating === 0) {
    console.log("naam");
    db.collection("products")
      .where("searchName", "array-contains", name)
      .orderBy("price")
      .startAfter(latestDoc || 0)
      .limit(limit)
      .startAt(min)
      .endAt(max)
      .get()
      .then((doc) => {
        const sendData = doc.docs.map((data) => data.data());
        latestDoc = doc.docs[doc.docs.length - 1];
        res.send(sendData);
      });
  } else {
    console.log("else");
    db.collection("products")
      .where("searchName", "array-contains", name)
      .where("rating", ">=", rating)
      .orderBy("rating")
      .where("category", "==", category)
      .orderBy(orderType, sortOrder)
      .startAfter(latestDoc || 0)
      .limit(limit)
      .startAt(min)
      .endAt(max)
      .get()
      .then((doc) => {
        const sendData = doc.docs.map((data) => data.data());
        latestDoc = doc.docs[doc.docs.length - 1];
        res.send(sendData);
      });
  }
};

【问题讨论】:

  • 这个问题有三个单独的查询。哪个不工作?
  • 嘿,谢谢。它是 else 语句中的查询,所以如果您在我的代码中向下滚动,则为最后一个

标签: javascript node.js firebase google-cloud-firestore


【解决方案1】:

您的查询存在一些问题:

  • 您在 2 个查询过滤器之间有一个 orderBy(),这是不允许的,因此您必须将 .orderBy("rating") 移动到 .where("category", "==", category) 之后;
  • 您的查询中有startAfter() 和startAt() 子句,您不能这样做,您要么在某个值之后开始,要么在固定位置开始;

假设您将查询更改为以下内容:

db.collection("products")
  .where("searchName", "array-contains", name)
  .where("category", "==", category)
  .where("rating", ">=", rating)
  .orderBy("rating")
  .orderBy(orderType, sortOrder)
  .limit(limit)
  .startAt(min)
  .endAt(max)
  .get()

它应该可以工作。

【讨论】:

  • 嘿@Wytrzymały Wiktor 不是 100%,但我可以通过改变一点点来解决我得到的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-24
  • 2017-11-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多