2017-06-14 78 views
0

我有以下问题,尽管我的搜索,我不出来...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"]} 

医师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)医生办公室收集“医生办公室”。每个医生办公室包括(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

你应该尝试在客户端做格式化,但如果你真的想在服务器端做,你可以使用$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; 
}); 
+0

* “你应该尝试做的格式在客户端......” *于是告诉他们如何!很有可能当这个人要求基本上重构一个结果的方式并不能真正减少服务器的数据时,他们就不知道如何操作代码中的结果数据结构。当你真正向他们展示它时,所有的“两行”代码都与长时间的聚合流水线阶段相对,然后*“灯泡”就会出现,人们通常会得到它。 –

+0

@Veeram我认为重要的是不要通过连接移动大量数据。但据我所知,尽管事实上产生的数据比需要的要多,但服务器更喜欢消耗更少的处理能力。最后,请求的数据在客户端进行整形。你能告诉我如何做到这一点吗?非常感谢您的宝贵时间!! –

+0

不客气。我已编辑帖子以包含客户端版本。 – Veeram