我们将一对多关系存储为MongoDB中的两个独立集合。关系是:1团队有很多人。我们故意将这些保存为单独的集合,因为我们希望能够单独查询它们。在做了大量研究之后我们决定了这个设计 - 我希望它有意义。以下是简化的Mongoose模式:
var TeamSchema = new Mongoose.Schema({
name: String
});
var PersonSchema = new Mongoose.Schema({
name: String
teamId: {
type: Mongoose.Schema.ObjectId,
ref: 'Team',
}
});
我想在将它们发送到前端之前加入以下两个集合:
[
{ "name": "John Doe", "Team": "Orange" },
{ "name": "Jane Smith", "Team": "Orange" },
{ "name": "Doug White", "Team": "Blue" }
]
我不介意做两个单独的查询来将每个集合放入内存中。问题是,一旦我将它们存储在内存中,加入集合的最有效方法是什么?
这是我开始做的,但加密代码不存在:
Person.find(function(err, people) {
Team.find(function(err, teams) {
// Now I have people and teams
// How to join them?
});
});
答案 0 :(得分:6)
我会选择使用population,这是在Mongoose中“加入”的常用方法。
您的架构已经为此设置,因此您只需调整查询:
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 };
}));