试图了解猫鼬如何填充或加入工作
Trying to understand how mongoose populate or join works
我只是想看看如何加入不同的 collection。假设我有一个病人 collection 和一个医生 collection。我想这样做是因为医生可能有很多病人,我不确定是否应该将所有病人放入名为 patients : []
的模型字段中的 objects 数组中,或者做我想做的事现在正在尝试使用填充方法猫鼬进行练习。
现在我有另一个问题。如果我使用 populate(join) 方法,所有医生和患者都会在一起。我觉得这很奇怪,因为听起来个人信息会与不同的人混淆。我知道 populate 通过将 Id 与 ref
相关联来将患者与医生相关联。这是个好方法吗?
无论如何,我尝试使用 populate,但我惨遭失败。我将向您展示下面的代码。如果您能像我描述的那样帮助我连接 2 个 collection,那就太棒了。如果您能解决其他一些问题,那就太好了。
我试图做的是将医生 2 与患者 1 相关联。
我收到一个错误:
throw new MongooseError.MissingSchemaError(name);
MissingSchemaError: Schema hasn't been registered for model "Doctor".
Use mongoose.model(name, schema)
代码
var express = require("express");
var app = express();
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/population");
var db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function(){
console.log("connected")
var doctorSchema = mongoose.Schema({
name : String,
address : String,
username: String,
password : String,
patients : [{type : mongoose.Schema.Types.ObjectId, ref: "Patient"}]
})
var patientSchema = mongoose.Schema({
_doctor : {type: mongoose.Schema.Types.ObjectId, ref : "Doctor"},
name: String,
illness : String
})
//compiling our schem into a Model. A class where we construct documents
var Doctor = mongoose.model("doctor", doctorSchema );
var Patient = mongoose.model("patient", patientSchema);
var doctor1 = new Doctor({name : "doc1", address :"add1", username :"user1", password : "pass1"})
console.log(doctor1.username);
//creating a patient for doctor2
var doctor2 = new Doctor({name: "doc2", address : "add2", username : "user2", password : "pass2"});
doctor2.save(function(err){
var patient1 = new Patient({
name : "pat1",
illness: "high",
_doctor: doctor2._id
})
patient1.save(function(err){
console.log("saved")
})
})
Patient.findOne({name : "pat1"})
.populate("_doctor")
.exec(function(err, patient){
console.log("the creator is %s", patient._doctor.name)
})
})
app.listen(3000, function(){
console.log("listening on port: " , 3000)
})
您的代码问题
首先,请您参考时确保正确的型号名称。
var Doctor = mongoose.model("Doctor", doctorSchema ); // rather than doctor
var Patient = mongoose.model("Patient", patientSchema); // rather than patient
其次,patient1
保存成功后,再到db中查找。因为 save()
是 Async 操作。
patient1.save(function(err){
if (err)
console.log(err);
else {
console.log("saved");
Patient.findOne({name : "pat1"})
.populate("_doctor")
.exec(function(err, patient){
if (err)
console.log(err);
else {
console.log(patient);
console.log("the creator is %s", patient._doctor.name);
}
});
}
});
数据模式
我们知道,要么将 patient
作为参考 doctor
var doctorSchema = mongoose.Schema({
patients : [{type : mongoose.Schema.Types.ObjectId, ref: "Patient"}]
});
或将 doctor
作为参考 patient
var patientSchema = mongoose.Schema({
_doctor : {type: mongoose.Schema.Types.ObjectId, ref : "Doctor"},
});
他们两个都可以。但是,数据模式应该满足您更高效查询的要求。
我更愿意把doctor
作为对patient
的参考,因为正如你所说,一个医生可以有更多的病人。 mongodb 文档的最大大小为 16 megabytes。如果我们将 patient
作为对 doctor
的引用,那么 doctor
文档在更多患者的情况下可能会更大。
不管怎样,你选择哪个模式来满足你的要求是第一位的。
我只是想看看如何加入不同的 collection。假设我有一个病人 collection 和一个医生 collection。我想这样做是因为医生可能有很多病人,我不确定是否应该将所有病人放入名为 patients : []
的模型字段中的 objects 数组中,或者做我想做的事现在正在尝试使用填充方法猫鼬进行练习。
现在我有另一个问题。如果我使用 populate(join) 方法,所有医生和患者都会在一起。我觉得这很奇怪,因为听起来个人信息会与不同的人混淆。我知道 populate 通过将 Id 与 ref
相关联来将患者与医生相关联。这是个好方法吗?
无论如何,我尝试使用 populate,但我惨遭失败。我将向您展示下面的代码。如果您能像我描述的那样帮助我连接 2 个 collection,那就太棒了。如果您能解决其他一些问题,那就太好了。
我试图做的是将医生 2 与患者 1 相关联。
我收到一个错误:
throw new MongooseError.MissingSchemaError(name);
MissingSchemaError: Schema hasn't been registered for model "Doctor".
Use mongoose.model(name, schema)
代码
var express = require("express");
var app = express();
var mongoose = require("mongoose");
mongoose.connect("mongodb://localhost/population");
var db = mongoose.connection;
db.on("error", console.error.bind(console, "connection error:"));
db.once("open", function(){
console.log("connected")
var doctorSchema = mongoose.Schema({
name : String,
address : String,
username: String,
password : String,
patients : [{type : mongoose.Schema.Types.ObjectId, ref: "Patient"}]
})
var patientSchema = mongoose.Schema({
_doctor : {type: mongoose.Schema.Types.ObjectId, ref : "Doctor"},
name: String,
illness : String
})
//compiling our schem into a Model. A class where we construct documents
var Doctor = mongoose.model("doctor", doctorSchema );
var Patient = mongoose.model("patient", patientSchema);
var doctor1 = new Doctor({name : "doc1", address :"add1", username :"user1", password : "pass1"})
console.log(doctor1.username);
//creating a patient for doctor2
var doctor2 = new Doctor({name: "doc2", address : "add2", username : "user2", password : "pass2"});
doctor2.save(function(err){
var patient1 = new Patient({
name : "pat1",
illness: "high",
_doctor: doctor2._id
})
patient1.save(function(err){
console.log("saved")
})
})
Patient.findOne({name : "pat1"})
.populate("_doctor")
.exec(function(err, patient){
console.log("the creator is %s", patient._doctor.name)
})
})
app.listen(3000, function(){
console.log("listening on port: " , 3000)
})
您的代码问题
首先,请您参考时确保正确的型号名称。
var Doctor = mongoose.model("Doctor", doctorSchema ); // rather than doctor
var Patient = mongoose.model("Patient", patientSchema); // rather than patient
其次,patient1
保存成功后,再到db中查找。因为 save()
是 Async 操作。
patient1.save(function(err){
if (err)
console.log(err);
else {
console.log("saved");
Patient.findOne({name : "pat1"})
.populate("_doctor")
.exec(function(err, patient){
if (err)
console.log(err);
else {
console.log(patient);
console.log("the creator is %s", patient._doctor.name);
}
});
}
});
数据模式
我们知道,要么将 patient
作为参考 doctor
var doctorSchema = mongoose.Schema({
patients : [{type : mongoose.Schema.Types.ObjectId, ref: "Patient"}]
});
或将 doctor
作为参考 patient
var patientSchema = mongoose.Schema({
_doctor : {type: mongoose.Schema.Types.ObjectId, ref : "Doctor"},
});
他们两个都可以。但是,数据模式应该满足您更高效查询的要求。
我更愿意把doctor
作为对patient
的参考,因为正如你所说,一个医生可以有更多的病人。 mongodb 文档的最大大小为 16 megabytes。如果我们将 patient
作为对 doctor
的引用,那么 doctor
文档在更多患者的情况下可能会更大。
不管怎样,你选择哪个模式来满足你的要求是第一位的。