// model Users.js
是用户模型:
module.exports = {
autoCreatedAt: false,
autoUpdatedAt: false,
tableName : 'users',
attributes: {
user_id: {
type: "string",
primaryKey: true
},
name : {
type : 'varchar'
},
register_items : {
collection : 'register',
via : 'business_owner_id',
dominant : true
}
}
};
// model Register.js
that is register model
module.exports = {
autoCreatedAt: false,
autoUpdatedAt: false,
tableName: 'register_items',
attributes: {
register_id: {
type: "integer",
primaryKey: true
},
business_owner_id: {
model: 'users'
}
}
};
// Controller
module.exports = {
getUser : (req,res) => {
Users.find().populate('register_items')
.then(users => {
res.json({status : 200, data : users});
}).catch(err => {
res.json({status : 500, message : 'Error ' + err});
});
}
};
user.findone(user_id).populate('register_items')
帆水线在SQL和NOSQL数据库的顶部都起作用 - 这意味着模仿内在连接功能的功能可能无法以您在SQL中使用的方式进行。
正如@Crusader在答案中指出的那样,设置模型的方式为您提供了一个不错的单线,用于使用已附加的register
项目获取user
:
Users.findOne(user_id).populate('register_items').exec(function(err, user) {
// handle errors and empty results...
console.log(user.register_items); // will be full objects
});
,但看来您已经在问题中使用了这样的代码。
由于该代码也必须在NOSQL的顶部工作,因此您不能保证您可以由数据库完成内部联接。在引擎盖下可能只是两个查询(一个接一个):
- 让我的用户
- 获取所有关联的寄存器
- 附加它们
,对于多对多的关系,情况甚至会更糟!
最重要的是,如果您使用的是水线,那么 - 与使用Mongo或任何NOSQL-涉及多个模型的逻辑相同,您的应用程序(您的代码或Waterline库)可以完成,而不是由数据库完成,您应该相应地计划数据存储。