我正在使用MongoDB开发一个NodeJS应用程序,我希望使用Mongoose复制SQL INNER JOIN的行为。我尝试了几个教程和方法,但没有得到想要的结果。我有以下模式设置:
const domainSchema = new mongoose.Schema({
domain: {
type: String,
required: true,
},
portfolioId: {
type: mongoose.Schema.Types.ObjectId, // Refers to an Object ID in the portfolioSchema
required: true,
ref: 'Portfolio'
},
});
const portfolioSchema = new mongoose.Schema({
portfolioName: {
type: String,
required: true,
},
userIds: {
type: mongoose.Schema.Types.ObjectId, // Refers to an Object ID in the userSchema
required: true,
ref: 'User'
}
});
const userSchema = new mongoose.Schema({
emailAddress: {
type: String,
required: true,
},
// Other user fields...
});
字符串
我已经用引用ID构建了我的模式,假设这是你在Mongoose中设置关系的方式。只给出用户的ID,我的目标是获取与该用户关联的所有投资组合以及每个投资组合中的域。这种模式结构适合这个目的吗?
如果有人能指导我具体的MongoDB和NodeJS代码来执行此操作,我将不胜感激。谢谢!
1条答案
按热度按时间qyzbxkaa1#
在mongoose中,你可以使用Model.populate()来执行从一个集合到另一个集合的查找。这与SQL中的左连接同义(但不完全相同)。
populate
方法将把文档中所有引用的ObjectId
值替换为另一个集合中相应的文档。在这个例子中:
字符串
const domains
现在将包含所有Domain
文档,其中包含所有Portfolio
文档,而不仅仅是它们的ID。popluale
的问题是,你不能根据子文档过滤父文档。所以你不能将populate
Portfolio
转换为Domain
,然后删除没有你想要的Portfolio
的Domain
结果。你需要使用aggregate。但是,您似乎是从
User._id
值开始的,这意味着您可以轻松地查询portfolios
集合,但是您必须对domains
集合执行另一个数据库查询,以便从以前的结果中找到匹配的portfolioId
。根据您当前的Schema设计,我的建议是在
Domain
模型上执行aggregate
查询。给定一个
User
文档,其中包含以下_id
:型
以下查询将返回所需的结果:
型
请参阅HERE以获取工作示例。
编辑:
或者,如果你能够重新构建你的schema,那么你可以添加一个
Domain
引用到你的Portfolio
schema,这将允许你搜索portfolios
集合。像这样更新你的portfolioSchema
:型
现在你可以像这样使用Model.populate:
型