mongoose如何做一对多查询

冉娃娃
  • 1.2k

业务背景

  • 有一个老师表teacher一个学生表student
  • 一个老师关联多个学生
  • 现在要查询老师的信息,以及所有学生的信息

我的代码

// 老师表
const teacherSchema = new mongoose.Schema({
  name: { type: String },
  students: [{ type: mongoose.Schema.Types.ObjectId, ref: 'student' }],
});
// 学生表
const studentSchema = new mongoose.Schema({
  name: { type: String },
  teacher: { type: mongoose.Schema.Types.ObjectId, ref: 'teacher' },
});
const Teacher = mongoose.model('teacher', teacherSchema);
const Student = mongoose.model('student', studentSchema);

(async function test() {
  // 新增一个老师
  const t = await Teacher.create({ name: '张老师' });
  // 新增一个学生
  const s = await Student.create({
    name: '李四',
    teacher: t._id,
  });
  // 将学生关联到老师
  t.students.push(s);
  await t.save();
  // 查询老师信息
  const teachers = await Teacher.find().populate('students');
  console.log(teachers);
}());

输入结果

[ 
  { students: [ [Object] ],
    _id: 5c69e591510ea44574287fea,
    name: '张老师',
    __v: 1 } ]

问题

  • 如果一个老师对应一千个学生,难道要把1000个学生给push到老师的students属性里?这也太夸张了吧?
回复
阅读 949
2 个回答
  1. 你的t.students.push(s);写法是不对的,应该是t.students.push(s._id);
  2. 把1000个学生给老师,那就是循环1000次,然后在进行数据库的存储操作,可以采用异步方式进行避免堵塞
一入江湖岁月催
  • 3
新手上路,请多包涵

想问一个问题。
比如产品和分类的关联。
我产品可以没有分类。可以有分类。我试了下。

const productSchema = new mongoose.Schema({
  name: { type: String },
  category: [{ type: mongoose.Schema.Types.ObjectId, ref: 'categories' }],
});
const categorySchema= new mongoose.Schema({
  name: { type: String },
});

如果productSchema里的category为空怎么办。。
不对。我这样写出来好像可以。如果只是对象就不行- -

你知道吗?

宣传栏