Попытка понять, как мангусты заполняют или присоединяются к работе

Я просто хочу посмотреть, как объединить разные коллекции. Предположим, у меня есть коллекция пациентов и коллекция врачей. Я хочу сделать это, потому что у врача может быть много пациентов, и я не уверен, должен ли я поместить всех пациентов в массив объектов в поле модели с именем patients : [] или сделать то, что я сейчас пытался практиковать с методом заполнения мангуста.

Теперь у меня другой вопрос. Если я воспользуюсь методом заполнения (присоединения), все пациенты-врачи будут вместе. Я думаю, что это странно, потому что похоже, что личная информация будет перепутана с разными людьми. Я знаю, что populate связывает пациента с врачом, связывая идентификатор с ref. Это хороший способ сделать это?

В любом случае, я пытался поиграть с populate, но с треском провалился. Я покажу вам код ниже. Если вы можете помочь мне соединить две коллекции так, как я описал, это было бы здорово. Также было бы здорово, если бы вы рассмотрели некоторые другие проблемы.

Что я пытался сделать, так это связать доктора 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)
})

person jack blank    schedule 22.01.2016    source источник
comment
Вы должны указать точное имя модели при ссылке на схему. вы определили врача в модели и врача в ссылке   -  person Mariya James    schedule 22.01.2016
comment
@MariyaJames Это помогло мне, у меня больше нет ошибки. Спасибо. Теперь я получаю, когда делаю db.doctors.find() -- { "_id" : ObjectId("56a0cb74c5ba46780e4d17c6"), "name" : "doc2", "address" : "ad d2", "username" : "user2", "password" : "pass2", "patients" : [ ], "__v" : 0 } РЕДАКТИРОВАТЬ: должны ли пациенты быть пустым массивом   -  person jack blank    schedule 22.01.2016
comment
вы ничего не вставили в список пациентов, вот почему.   -  person Mariya James    schedule 22.01.2016
comment
Я вставляю данные в поле пациента, используя .populate('patients')? Я думаю, что хочу, чтобы в полях пациентов был массив ObjectId пациентов, принадлежащих врачу. Я до сих пор не получил это.   -  person jack blank    schedule 23.01.2016


Ответы (1)


Проблемы с вашими кодами

Прежде всего, убедитесь, что вы указали правильное название модели.

var Doctor = mongoose.model("Doctor", doctorSchema ); // rather than doctor
var Patient = mongoose.model("Patient", patientSchema); // rather than patient

Во-вторых, после успешного сохранения patient1 найдите его в БД. Поскольку save() — это асинхронная операция.

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 мегабайт. Если мы поместим patient в качестве ссылки на doctor, документ doctor может быть больше при большем количестве пациентов.

В любом случае, какую схему вы выбрали для удовлетворения ваших требований, это первая проблема.

person zangw    schedule 22.01.2016