javascript - Mongoose 找不到所需的输出

标签 javascript node.js mongodb express mongoose

我有三个架构。

用户.js:

const mongoose = require("mongoose");
const bcrypt = require("bcryptjs");
const userSchema = new mongoose.Schema({
  name: {
    type: String,
    required: true,
  },
  email: {
    type: String,
    unique: true,
    required: true,
  },
  password: {
    type: String,
    required: true,
  },
});

userSchema.pre("save", function (next) {
  const user = this;
  if (!user.isModified("password")) {
    return next();
  }

  bcrypt.genSalt(10, (err, salt) => {
    if (err) {
      return next(err);
    }
    bcrypt.hash(user.password, salt, (err, hash) => {
      if (err) {
        return next(err);
      }
      user.password = hash;
      next();
    });
  });
});

userSchema.methods.comparePassword = function (candidatePassword) {
  const user = this;
  return new Promise((resolve, reject) => {
    bcrypt.compare(candidatePassword, user.password, (err, isMatch) => {
      if (err) {
        return reject(err);
      }

      if (!isMatch) {
        return reject(false);
      }

      resolve(true);
    });
  });
};

mongoose.model("User", userSchema);

项目.js:

const mongoose = require("mongoose");

const diamondSchema = new mongoose.Schema({
  criteria: {
    novelty: String,
    technology: String,
    complexity: String,
    pace: String,
  },
});

const projectSchema = new mongoose.Schema({
  userId: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "User",
  },
  projectName: {
    type: String,
    default: "",
  },
  projectBudget: {
    type: Number,
  },
  projectDuration: {
    type: Number,
  },
  industry: {
    type: String,
  },
  companyName: {
    type: String,
  },
  numberOfEmployees: {
    type: Number,
  },
  diamond: [diamondSchema],
});

mongoose.model("Project", projectSchema);

推荐.js:

const mongoose = require("mongoose");

const diamondSchema = new mongoose.Schema({
  criteria: {
    novelty: String,
    technology: String,
    complexity: String,
    pace: String,
  },
});

const recommendationSchema = new mongoose.Schema({
  diamond: [diamondSchema],
  description: {
    type: String,
  },
});

mongoose.model("Recommendation", recommendationSchema);

还有两个路由文件。

authRoutes.js:

const express = require("express");
const mongoose = require("mongoose");
const User = mongoose.model("User");
const jwt = require("jsonwebtoken");

const router = express.Router();

router.post("/signup", async (req, res) => {
  const { name, email, password } = req.body;

  try {
    const user = new User({ name, email, password });

    await user.save();

    const token =
      //token has payload-->user id
      jwt.sign({ userId: user._id }, "MY_SECRET_KEY");

    res.send({ token });
  } catch (err) {
    //invalid data
    return res.status(422).send(err.message);
  }
});

router.post("/signin", async (req, res) => {
  const { email, password } = req.body;

  if (!email || !password) {
    return res.status(422).send({ error: "Must provide email and password" });
  }
  const user = await User.findOne({ email });
  if (!user) {
    return res.status(404).send({ error: "Invalid email or password" });
  }

  try {
    await user.comparePassword(password);
    const token = jwt.sign({ userId: user._id }, "MY_SECRET_KEY");
    res.send({ token });
  } catch (err) {
    return res.status(422).send({ error: "Invalid email or password" });
  }
});

module.exports = router;

projectRoutes.js:

const express = require("express");

const mongoose = require("mongoose");

const requireAuth = require("../middlewares/requireAuth");

const Project = mongoose.model("Project");
const Recommendation = mongoose.model("Recommendation");
const router = express.Router();

router.use(requireAuth);

router.get("/projects", async (req, res) => {
  const projects = await Project.find({ userId: req.user._id });
  res.send(projects);
});

router.post("/projects", async (req, res) => {
  const {
    projectName,
    projectBudget,
    projectDuration,
    industry,
    companyName,
    numberOfEmployees,
    diamond,
  } = req.body;

  if (
    !projectName ||
    !projectBudget ||
    !projectDuration ||
    !industry ||
    !companyName ||
    !numberOfEmployees ||
    !diamond
  ) {
    return res.status(422).send({ error: "Must provide all project details" });
  }

  try {
    const project = new Project({
      projectName,
      projectBudget,
      projectDuration,
      industry,
      companyName,
      numberOfEmployees,
      diamond,
      userId: req.user._id,
    });

    await project.save();

    //res.send(project);
  } catch (err) {
    res.status(422).send({ error: err.message });
  }
  try {
    const rec = await Recommendation.find({ diamond });
    //console.log(diamond);
    console.log(description);
    res.send(rec);
  } catch (err1) {
    res.status(422).send({ error: err1.message });
  }
});

module.exports = router;

当我尝试在projectRoutes.js文件中使用postman发送post请求时 localhost:3000/projects ,我正在尝试创建一个新项目,作为响应我想要 description 。我的逻辑是,当我将新项目保存在 projects 中后集合,我正在尝试查找具有相同钻石对象 criteria 的文档在recommendations集合也存在于projects中收藏。意思是,我在recommendations中有预定义的记录。收藏和projects收藏::

recommendations collection

projects collection

所以我需要某种方法,以便当我尝试为用户添加新项目时,criteria diamond 中的对象我将匹配的数组设置为 diamond 中的条件对象预定义数组之一 recommendations文件和邮寄请求localhost:3000/projects我可以回description作为回应。正如我正在做的console.log(description)projectRoutes.js ,它显示为未定义。我不知道为什么。希望这是有道理的。

基本上,我们的想法是,具有独特标准的推荐数量有限。因此,每当根据标准创建新项目时,都会向用户显示推荐。

最佳答案

假设您的项目和推荐中只有一个数组元素

const {
  projectName,
  projectBudget,
  projectDuration,
  industry,
  companyName,
  numberOfEmployees,
  diamond,
} = req.body;

const [projectDiamond] = diamond // get the first object in the diamond array
const { criteria } = projectDiamond // extract criteria

const recommendation = await Recommendation.find({ 'diamond.criteria': criteria });

请注意,条件字段的顺序必须匹配,因为我们正在数组中查找匹配的对象。

引用:https://docs.mongodb.com/manual/tutorial/query-arrays/#query-an-array

关于javascript - Mongoose 找不到所需的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61458418/

相关文章:

javascript - 尽可能使用重复值存储数组的子集

mysql - API性能测试连接超时

node.js - Heroku 上的 mongodb 驱动程序出现错误 : Cannot find module 'mongodb-core'

c++ - 在 Windows 上编译 mongo db 客户端示例时出现链接器错误

javascript - 如何仅使用 javascript 设置输入[范围]的拇指样式?

javascript - 正则表达式排除特定位

javascript - 为什么有些 npm 包以 @ 开头?

node.js - Phantom JS for Node,使用打印样式表?

node.js - 环回异步/等待 UnhandledPromiseRejectionWarning 问题

node.js - NodeJS + Express 慢慢消耗越来越多的 CPU