我有以下问题,尽管我搜索过,但我无法弄明白......
我有两个具有以下值的集合:
DOCTOROFFICES COLLECTION
{ _id: 1, name: "doctoroffice1", appointment_hours:["09:00","10:00","11:00"]}
{ _id: 2, name: "doctoroffice2", appointment_hours:["09:30","11:30"]}
DOCTORS COLLECTION
{_id: 1, name: "Kostas", lastname: "Pap", tel: "1234567890", doctoroffice: "doctoroffice1", rating: { totalRate: 300, totalVotes: 100 } }
{_id: 2, name: "George", lastname: "Geo", tel: "7890246899", doctoroffice: "doctoroffice1", rating: { totalRate: 400, totalVotes: 200 } }
{_id: 3, name: "Mark", lastname: "Ma", tel: "24689001122", doctoroffice: "doctoroffice2", rating: { totalRate: 450, totalVotes: 310 } }
{_id: 4, name: "Paul", lastname: "Pa", tel: "2244668800", doctoroffice: "doctoroffice2", rating: { totalRate: 40, totalVotes: 10 } }
如上所述,我与(2)医生办公室收集了“Doctoroffices”。每个医生办公室由(2)名医生组成,保存在“医生”系列中。 我的目标是从我的MongoDB产生以下JSON答案:
{
doctorOfficeLabel: "doctoroffice1",
ratingData: [
{ doctorName: "Kostas",
doctorLastname: "Pap",
totalRate: 300,
totalVotes: 100 },
{ doctorName: "George",
doctorLastname: "Geo",
totalRate: 400,
totalVotes: 200 }
]
},
{
doctorOfficeLabel: "doctoroffice2",
ratingData: [
{ doctorName: "Mark",
doctorLastname: "Ma",
totalRate: 450,
totalVotes: 310 },
{ doctorName: "Paul",
doctorLastname: "Pa",
totalRate: 40,
totalVotes: 10 }
]
}
到目前为止我的解决方案是:
db.doctoroffices.aggregate([
{$lookup: {
from: "doctors",
localField: "name",
foreignField: "doctoroffice",
as: "doctor_docs"
}
},
{$unwind: "$doctor_docs"},
{$project: {
_id: 0,
doctorOfficeLabel: "$name",
ratingData: {
doctorName: "$doctor_docs.name",
doctorLastname: "$doctor_docs.lastname",
totalRate: "$doctor_docs.rating.totalRate",
totalVotes: "$doctor_docs.rating.totalVotes",
}
}
}
]
这里的问题是创建了多个具有相同“doctorOfficeLabel”的对象,但我想要与医生办公室的数量一样多的对象。 我还尝试了上面没有{$ unwind:“$ doctor_docs”}的代码,但结果也不如预期。
任何人都可以帮助我解决我的问题,或者如果我的问题无法解决,建议我解决方法吗?
非常感谢你的时间!!
答案 0 :(得分:0)
您应该尝试在客户端进行格式化,但如果您确实想在服务器端进行格式化,则可以使用$map
。
服务器端
像
这样的东西db.doctoroffices.aggregate([{
$lookup: {
from: "doctors",
localField: "name",
foreignField: "doctoroffice",
as: "doctor_docs"
}
},
{
$project: {
_id: 0,
doctorOfficeLabel: "$name",
ratingData: {
$map: {
input: "$doctor_docs",
as: "result",
in: {
doctorName: "$$result.name",
doctorLastname: "$$result.lastname",
totalRate: "$$result.rating.totalRate",
totalVotes: "$$result.rating.totalVotes",
}
}
}
}
}
])
客户端
db.doctoroffices.aggregate({
$lookup: {
from: "doctors",
localField: "name",
foreignField: "doctoroffice",
as: "doctor_docs"
}
}).map(a => {
var doctoroffice = {
doctorOfficeLabel: a.name
};
doctoroffice.ratingData = a.doctor_docs.map(b => {
var doctordoc = {
doctorName: b.name,
doctorLastname: b.lastname,
totalRate: b.rating.totalRate,
totalVotes: b.rating.totalVotes
}
return doctordoc;
});
return doctoroffice;
});