2014-12-07 49 views
3

我有兩個模型對象。醫生和醫院。該模型的定義是這樣的:如何過濾基於從多對多收集查詢

module.exports = { 

    schema: true, 

    autoUpdatedAt: true, 
    autoCreatedAt: true, 
    attributes: { 
    name: { 
     type: 'string', 
     required: true, 
     unique: true 
    }, 
    hospitals: { 
     collection: 'hospital', 
     via: 'doctors', 
     dominant: true, 
    }, 
    } 
}; 

module.exports = { 
    schema: true, 
    autoUpdatedAt: true, 
    autoCreatedAt: true, 
    attributes: { 
    name: { 
     type: 'string', 
     required: true, 
     unique: true 
    }, 
    doctors: { 
     collection: 'doctor', 
     via: 'hospitals', 
    }, 
    } 
}; 

我如何查詢映射到某些醫院的醫生?我閱讀了一些關於through關鍵字的文章,但我無法獲得記錄來堅持通過/連接表。似乎如果我可以查詢自動連接表,我可以得到它的工作,但我很好奇,如果有一種「官方」的方式來完成這種類型的查詢。

我當前的查詢是這樣的:Doctor.find().where({'hospitals': ['548303dcf49435ec4a01f2a2','548303cbf49435ec4a01f2a0']}).populate('hospitals').exec(function (err, doctors) { ... });

底層的數據庫是蒙戈,如果該事項。

回答

1

我做了一些欺騙,但事情似乎有效。這就是說,如果有更好的方法來完成這種查詢,我很感興趣。

我創建了一個映射到自動創建的連接表的模型對象。所以在這種情況下,我更多的模型對象的樣子:

module.exports = { 

    schema: true, 

    autoUpdatedAt: true, 
    autoCreatedAt: true, 
    tableName: 'doctor_hospitals__hospital_doctors', 
    attributes: { 

    doctor: { 
     model: 'doctor', 
     columnName: 'doctor_hospitals' 
    }, 

    hospital: { 
     model: 'hospital', 
     columnName: 'hospital_doctors' 
    } 
    } 
}; 

現在,我直接查詢連接表,並使用結果的子查詢:

DoctorHospital.find().where({'hospital': ['548303dcf49435ec4a01f2a2','548303cbf49435ec4a01f2a0']}).exec(function(err, doctorHospitals) { 
    if(err) return next(err); 

    Doctor.find().where({'id': _.pluck(doctorHospitals, 'doctor')}).populate('hospitals').exec(function (err, doctors){ 
    if(err) return next(err); 

    return res.view({ 
     doctors: doctors 
    }); 
    }); 
});