【问题标题】:How to prevent duplicate name in Database but same person can take two courses如何防止数据库中重名但同一人可以上两门课程
【发布时间】:2020-03-25 22:03:54
【问题描述】:

我正在使用 MERN(MongoDB、Express、React js 和 Node)创建一个完整的堆栈。目前,我正在处理我的后端。我正在使用 REST API 并测试我使用 Postman 的 HTTP 请求。我的目标是,一个学生可以上多节课。例如:体操1、健身等课程。

我创建了两个表。一个是学生表,另一个是课程表。我做了两个表之间的关系。但问题是当我添加具有相同人名和详细信息的新数据时,它会显示另一个数据集。我不知道如何防止重复的名称数据。

我的目标是这样的:

{
  "students": [
    {
      "id": 1,
      "name": "Anni Anonen",
      "birthday": "1992-02-28",
      "address": "Kivakatu 1",
      "zipcode": "00500",
      "city": "Helsinki",
      "phone": "+358506760702",
      "email": "anni.anonen@testing.fi",
      "courses": [1]
    },
    {
      "id": 2,
      "name": "Ville Anonen",
      "birthday": "2000-03-28",
      "address": "Hämeentie 1",
      "zipcode": "00510",
      "city": "Helsinki",
      "phone": "+358508660702",
      "email": "ville.anonen@testing.fi",
      "courses": [1]
    },
    {
      "id": 3,
      "name": "Tapani Kumpu",
      "birthday": "1999-05-28",
      "address": "Jokukatu 17",
      "zipcode": "00560",
      "city": "Helsinki",
      "phone": "+358502330702",
      "email": "tapani.kumpu@testing.fi",
      "courses": [1]
    },
    {
      "id": 4,
      "name": "Milla Moilanen",
      "birthday": "1989-07-21",
      "address": "Testikatu 3",
      "zipcode": "00720",
      "city": "Helsinki",
      "phone": "+358501750702",
      "email": "milla.moilanen@testing.fi",
      "courses": [2]
    },
    {
      "id": 5,
      "name": "Maria Manninen",
      "birthday": "2002-09-28",
      "address": "Vilhonkatu 12",
      "zipcode": "00800",
      "city": "Helsinki",
      "phone": "+358509890702",
      "email": "maria.manninen@testing.fi",
      "courses": [2, 3]
    },
    {
      "id": 6,
      "name": "Konsta Koistinen",
      "birthday": "2003-010-20",
      "address": "Pasilan raitti 21",
      "zipcode": "00100",
      "city": "Helsinki",
      "phone": "+358504760702",
      "email": "konsta.koistinen@testing.fi",
      "courses": [1, 3]
    }

  ],
  "courses": [
    {
      "id": 1,
      "name": "Gymnastics 1",
      "startdate": "2020-01-01",
      "enddate": "2020-02-10"
    },
    {
      "id": 2,
      "name": "Gymnastics 2",
      "startdate": "2020-01-01",
      "enddate": "2020-02-10"
    },
    {
      "id": 3,
      "name": "Fitness 1",
      "startdate": "2020-02-01",
      "enddate": "2020-02-20"
    },
    {
      "id": 4,
      "name": "Dance 1",
      "startdate": "2020-05-01",
      "enddate": "2020-05-02"
    }
  ]
}

这是我的带有 Rest API 的快速服务器

require("dotenv").config();
const express = require("express");
const app = express();
const morgan = require("morgan");
const helmet = require("helmet");
const cors = require("cors");
const mongoose = require("mongoose");
const student = require("./models/student");
const course = require("./models/course");
//app middlewear
app.use(morgan("common"));
app.use(helmet());
app.use(cors());
app.use(express.json()); //body Parser

//Connect to db
mongoose
  .connect(process.env.MONGODB_URI, {
    useUnifiedTopology: true,
    useNewUrlParser: true
  })
  .then(() => console.log("DB Connected!"))
  .catch(err => {
    console.log(err);
  });

//student

app.get("/students", async (req, res, next) => {
  try {
    await student
      .find()
      .populate("course")
      .select("name birthday address zipcode city phone email")
      .then(docs => {
        const response = {
          count: docs.length,
          students: docs
        };
        res.json(response);
      });
  } catch (error) {
    console.log(error);
  }
});

app.get("/students/:id", async (req, res, next) => {
  const id = req.params.id;
  try {
    student
      .findById(id)
      .exec()
      .then(data => {
        console.log(data);
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.put("/students/:id", async (req, res, next) => {
  const id = req.params.id;
  const update = {};
  for (const datas of req.body) {
    update[datas.updateData] = datas.value;
  }
  try {
    student
      .update({ _id: id }, { $set: update })
      .exec()
      .then(data => {
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.delete("/students/:id", async (req, res, next) => {
  const id = req.params.id;

  try {
    student
      .remove({ _id: id })
      .exec()
      .then(data => {
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.post("/students", async (req, res, next) => {
  const logs = new student({
    _id: mongoose.Types.ObjectId(),
    name: req.body.name,
    birthday: req.body.birthday,
    address: req.body.address,
    zipcode: req.body.zipcode,
    city: req.body.city,
    phone: req.body.phone,
    email: req.body.email,
    course: req.body.courseid
  });
  logs
    .save()
    .then(data => {
      console.log(data);
      res.json(data);
    })
    .catch(err => {
      console.log(err);
    });
});
//course
app.get("/courses", async (req, res, next) => {
  try {
    await course
      .find()
      .select("name  student startdate enddate")

      .then(docs => {
        const response = {
          count: docs.length,
          courses: docs
        };
        res.json(response);
      });
  } catch (error) {
    console.log(error);
  }
});

app.get("/courses/:id", async (req, res, next) => {
  const id = req.params.id;
  try {
    course
      .findById(id)
      .select("name  student startdate enddate")
      .exec()
      .then(data => {
        console.log(data);
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.put("/courses/:id", async (req, res, next) => {
  const id = req.params.id;
  const update = {};
  for (const datas of req.body) {
    update[datas.updateData] = datas.value;
  }
  try {
    course
      .update({ _id: id }, { $set: update })
      .exec()
      .then(data => {
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.delete("/courses/:id", async (req, res, next) => {
  const id = req.params.id;

  try {
    course
      .remove({ _id: id })
      .exec()
      .then(data => {
        res.json(data);
      });
  } catch (error) {
    console.log(error);
  }
});

app.post("/courses", async (req, res, next) => {
  const logs = new course({
    _id: mongoose.Types.ObjectId(),
    name: req.body.name,
    startdate: req.body.startdate,
    enddate: req.body.enddate
  });
  logs
    .save()
    .then(data => {
      console.log(data);
      res.json(data);
    })
    .catch(err => {
      console.log(err);
    });
});

const port = process.env.PORT || 5000;
app.listen(port, () => console.log(`???? App is listening at port ${port}!`));

这是我的学生架构

const mongoose = require("mongoose");
const { Schema } = mongoose;

const studentModel = new Schema({
  _id: mongoose.Schema.Types.ObjectId,
  name: {
    type: String,
    required: true
  },
  birthday: {
    type: Date,
    required: true
  },
  address: {
    type: String,
    required: true
  },
  zipcode: {
    type: Number,
    required: true
  },
  city: {
    type: String,
    required: true
  },
  phone: {
    type: Number,
    required: true
  },

  email: {
    type: String,
    required: true
  },
  course: {
    type: mongoose.Schema.Types.ObjectId,
    ref: "Course",
    required: true
  }
});

const student = mongoose.model("Student", studentModel);
module.exports = student;

这是课程架构

const mongoose = require("mongoose");
const { Schema } = mongoose;

const courseModel = new Schema({
  name: {
    type: String,
    required: true
  },
  startdate: {
    type: Date,
    required: true
  },
  enddate: {
    type: Date,
    required: true
  }
});

const course = mongoose.model("Course", courseModel);
module.exports = course;

duplicate result visualization

【问题讨论】:

  • Juha 你所有的学生都有 _id 作为主键。您应该改为防止重复 _id。
  • 你能用代码告诉我吗@eli
  • Juha 我改变了主意,考虑使用电子邮件作为主键,正如 Rahul 在下面建议的那样,因为我们可以有两个同名的人,但每个人都有唯一的电子邮件。
  • 但是,当我发布不同课程的同一个人时,它仍然阻止了我:(。你们得到了我想要的东西吗:D

标签: node.js rest express


【解决方案1】:

为了防止重复的名称数据。 我建议将电子邮件设置为唯一,因为两个人可以有相同的名字,但他们总是有一个唯一的电子邮件。

如下所示修改您的学生架构。

const mongoose = require("mongoose"); const {Schema} = mongoose; const studentModel = new Schema({ _id: mongoose.Schema.Types.ObjectId, name: { type: String, required: true }, birthday: { type: Date, required: true }, address: { type: String, required: true }, zipcode: { type: Number, required: true }, city: { type: String, required: true }, phone: { type: Number, required: true }, email: { type: String, required: true, unique: true }, course: { type: mongoose.Schema.Types.ObjectId, ref: "Course", required: true } }); const student = mongoose.model("Student", studentModel); module.exports = student;

【讨论】:

  • 对于订阅,学生课程的多门课程应该是学生架构中的一个数组
猜你喜欢
  • 2013-05-17
  • 1970-01-01
  • 2014-04-18
  • 1970-01-01
  • 2017-04-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-24
相关资源
最近更新 更多