在单独获取MongoDB集合后加入它们

时间:2014-01-03 06:15:28

标签: node.js mongodb mongoose

我们将一对多关系存储为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?
    });
});

1 个答案:

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