MongoDB - 如何从联合集合中投影两个或多个字段

时间:2017-06-14 18:56:18

标签: node.js mongodb

我有以下问题,尽管我搜索过,但我无法弄明白......

我有两个具有以下值的集合:

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”}的代码,但结果也不如预期。

任何人都可以帮助我解决我的问题,或者如果我的问题无法解决,建议我解决方法吗?

非常感谢你的时间!!

1 个答案:

答案 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;
});