在单独获取MongoDB集合后join

我们有一个一对多的关系存储在MongoDB中的两个独立的集合。 关系是:1团队有很多人。 我们故意将它们保存为单独的集合,因为我们希望能够单独查询它们。 我们在做了一堆研究之后决定了这个devise – 我希望这是有道理的。 这里是简化的Mongoose模式:

var TeamSchema = new Mongoose.Schema({ name: String }); var PersonSchema = new Mongoose.Schema({ name: String teamId: { type: Mongoose.Schema.ObjectId, ref: 'Team', } }); 

在将它们发送到前端之前,我想先join以下两个集合:

 [ { "name": "John Doe", "Team": "Orange" }, { "name": "Jane Smith", "Team": "Orange" }, { "name": "Doug White", "Team": "Blue" } ] 

我不介意做两个单独的查询来获得每个集合到内存中。 问题是,一旦我把它们join到内存中,最有效的方法是什么?

这就是我开始做的,但join代码不在那里:

 Person.find(function(err, people) { Team.find(function(err, teams) { // Now I have people and teams // How to join them? }); }); 

       

网上收集的解决方案 "在单独获取MongoDB集合后join"

我会select使用人口 ,这是在mongoose“join”的常见方法。

您的模式已经为此设置,所以你只需要调整你的查询:

 Person.find().populate('teamId').exec(function(err, people) { ... }); 

people数组将如下所示:

 [ { name: 'John Doe', teamId: { name: 'Orange', _id: ..., __v: 0 }, _id: ..., __v: 0 }, { name: 'Jane Smith', teamId: { name: 'Orange', _id: ..., __v: 0 }, _id: ..., __v: 0 }, { name: 'Doug White', teamId: { name: 'Blue', _id: ..., __v: 0 }, _id: ..., __v: 0 } ] 

为了得到你想要的结果,很简单,就是在其上运行一个map

 var results = people.map(function(person) { return { name : person.name, Team : person.teamId.name }; }));