recherche

Maison  >  Questions et réponses  >  le corps du texte

Requête mongodb avec deux paramètres

Quelqu'un a-t-il une idée de la manière dont je pourrais modifier ce code afin de pouvoir effectuer une recherche en fonction du titre, de la note, ou des deux ? J'ai essayé plusieurs approches, notamment en utilisant l'opérateur $and, sans succès

static async getMovies({
    filters = null,
    page = 0,
    moviesPerPage = 20,
  } = {}) {
    let query = {}
    if (filters) {
      if ("title" in filters) {
        console.log(filters["title"]);
        query.title = { $regex: filters["title"], $options: "i" };
      }  if ("rated" in filters) {
        query.rated = { $eq: filters["rated"] };
      }
    }

    let cursor
    try {
      cursor = await movies.find(query)
        .limit(moviesPerPage)
        .skip(moviesPerPage * page);
      const moviesList = await cursor.toArray();

      for (let i = 0; i < moviesList.length; i++) {
        const movie = moviesList[i];
        const movieReviews = await reviews
          .find({ movie_id: movie._id })
          .toArray();
        movie.review = movieReviews;
      }

      const totalNumMovies = await movies.countDocuments(query);
      return { moviesList, totalNumMovies };
    } catch (e) {
      console.error(`无法发出查找命令,${e}`);
      return { moviesList: ["error"], totalNumMovies: 0 };
    }
  }
P粉665679053P粉665679053476 Il y a quelques jours635

répondre à tous(1)je répondrai

  • P粉986860950

    P粉9868609502023-09-12 14:14:58

    Si vous souhaitez effectuer une recherche basée sur le nom ou la note, ou les deux, vous pouvez simplement utiliser la requête ci-dessous. Vous n'avez pas besoin d'utiliser l'opérateur $eq avec des filtres évalués. La fonction find de Mongoose fera correspondre la valeur directement sans utiliser l'opérateur $eq.

    if (filters?.title) {
      query.title = { $regex: `^${filters.title.replace(/[-[\]{}()*+?.,\/^$|#\s]/g, "\$&")}`, $options: "i" }
    }  
    if (filters?.rated) {
      query.rated = filters.rated
    }
    console.log(query)

    répondre
    0
  • Annulerrépondre