Добавление JSON объекта в Redis, который можно запросить - nodejs - PullRequest
0 голосов
/ 10 февраля 2020

Первоначально я пытался добавить документы, возвращенные из User.find ({}), в кэш redis как отсортированный набор, чтобы я мог выполнять нумерацию страниц. вот так: client.zadd("directory", documents_id, docsString, (err, reply) => {

Я начинаю задумываться, нужно ли мне использовать hmset, поскольку я имею дело с несколькими элементами в JSON объекте, но я не уверен, как запросить, если это тот случай. Я ищу лучшее решение, которое позже позволит мне разбивать данные на страницы, а также иметь ключевое слово, которое возвращает совпадающие значения в полях (если это возможно в любой степени с помощью redis)

app.get("/api/users", (req, res, next) => {

     var searchKey = new RegExp(req.query.usernameSearch, "i");

    console.log("CURRENT PAGE IS " + req.query.currentPage);
    client.zrange("directory", 0, -1, (err, reply) => {
      console.log("reply");
      console.log(reply);

      console.log(err);

      if (err) {
        res.status(401).json({
          message: "Directory Cache Error!"
        });
        return;
      } else if (reply) {
        console.log("GRABBING FROM CACHE");
        let packageReply = JSON.parse(reply);
        console.log("packageReply");
        console.log(packageReply);
        let totatArtists = packageReply.length;
        res.status(200).json({
          message: "Grabbed from cache",
          posts: packageReply,
          maxPosts: totatArtists
        });
      } else {
        console.log("GRABBING FROM DB");

        User.countDocuments({
          $and: [{ username: searchKey }, { role: "Seller" }]
        }).then(docs => {
          let totalPosts = docs;
          let postPerPage = 20;
          User.find({
            $and: [{ username: searchKey }, { role: "Seller" }]
          })
            .select("_id username")
            .skip(postPerPage * (currentPage - 1))
            .limit(postPerPage)
            .then(documents => {
              let docsString = JSON.stringify(documents);
              client.zadd(
                "directory",
                documents_id,
                docsString,
                (err, reply) => {
                  client.expire("directory", 3600);

                  res.status(200).json({
                    message: "Users retrieved successfully!",
                    posts: documents
                  });
                }
              );
            });
        });
      }
    });

пример вывода

 [{ _id: 5e34482ce04d7c0ca4725f92, username: 'bob' },
  { _id: 5e344842e04d7c0ca4725f93, username: 'joe' },
  { _id: 5e383e5dace65e4774e646e1, username: 'bill' },
  { _id: 5e383e63ace65e4774e646e2, username: 'sue' }]

1 Ответ

0 голосов
/ 11 февраля 2020

Функция client.zadd("directory", ... имеет параметры:

  1. Первый - ключ Z-набора
  2. Второй - оценка (число)
  3. Третий это новое значение

Предполагая, что идентификатор документа - это оценка, которую вы хотите использовать для последующего извлечения, вы должны сделать:

client.zadd("directory", documents._id, docsString, ...
...