如何解决如何使用Mongoose返回所有子文档
我正在使用猫鼬,并且想访问子文档中的所有子文档。简而言之,我想返回存储在诊所文档中的牙医子文档中的所有 booking 子文档。
现在,我的解决方案包含很多循环,但是必须有更好的方法。下面的代码有效并描述了我的野心。如果愿意,我愿意重新安排架构结构。请帮助我改进它。
router.post('/available-times',function (req,res) {
let available_times = [];
Clinic.find()
.then((clinics)=> {
clinics.forEach((clinic) => {
clinic.dentists.forEach((dentist) => {
dentist.schedule.forEach((booking) => {
if(!booking.reserved){
available_times.push(booking)
}
})
})
});
const response = {
success: true,result: available_times,}
res.json(response)
})
.catch(err => res.status(400).json("Error: " + err));
})
诊所模式:
const clinicSchema = new Schema({
address: { type: String},clinic_name: { type: String},contact_person: { type: String},dentists: [Dentist.schema],description: { type: String},email: { type: String},isVerified: { type: Boolean,default: false },location: { type: String},logo_url: { type: String},});
牙医模式:
const dentistSchema = new Schema({
biography: { type: String},languages_spoken: [String],name: { type: String},offered_services: [String],picture_url: { type: String},reviews: { type: Array},schedule: [Booking.schema],});
预订模式:
const bookingSchema = new Schema({
title: { type: String},start: { type: Date},end: { type: Date},customer_email: { type: String},customer_name: { type: String},customer_phone: { type: String},dentist_id: { type: String},dentist_name: { type: String},clinic_id: { type: String},price: { type: Number},reserved: { type: Boolean,});
解决方法
我猜集合Clinic
的结构看起来像这样
[
{
_id: ObjectId('5fa36e4d0e5796a0221bad0d'),dentists: [
{schedule: [{booking: {reserved: true,foo: 'bar1'}}]},{
schedule: [
{booking: {reserved: false,foo: 'bar2'}},{booking: {reserved: true,foo: 'bar3'}}
]
}
]
},{
_id: ObjectId('5fa373340e5796a0221bad0e'),foo: 'bar4'}}]},{schedule: [{booking: {reserved: false,foo: 'bar5'}}]}
]
}
]
如果结构正确,则可以运行聚合
Clinic.aggregate(
[
{
$project: {
_id: 0,temp: '$dentists.schedule.booking'
}
},{
$unwind: {
path: '$temp'
}
},{
$match: {
'temp.reserved': true
}
},{
$group: {
_id: null,available_times: {
$addToSet: '$temp'
}
}
}
]
)
您可以获得类似的结果
{
_id: null,available_times: [
{reserved: true,foo: "bar4"},{reserved: true,foo: "bar3"},foo: "bar1"}
]
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。