使用 Sails.js waterline 跨多个模型进行高效查询
Efficient queries across several models using Sails.js waterline
我正在尝试找到一种有效的方法来检索分布在多个模型中的结果。在我的示例中,我有三个模型:
Video
存储视频数据,包括视频的创建者
User
存储用户数据
Follower
存储哪些用户关注哪些其他用户
我的模型的简化版本如下所示:
// Video.js
module.exports = {
attributes: {
title: {
type: 'string'
},
creator: {
model: 'User'
}
}
};
// User.js
module.exports = {
attributes: {
user_name: {
type: 'string'
}
}
};
// Follower.js
module.exports = {
attributes: {
user: {
model: 'User'
},
follower: {
model: 'User'
}
}
};
我意识到我可以将多对多关联作为 Collection
直接存储在 User
中,但我也将其他值与其一起存储,例如用户何时开始关注另一个用户他从哪个目的地这样做的。此外,我存储了很多类似的数据,我想保持 Video
和 User
等核心模型精简。
所以现在我正在尝试获取由给定用户关注的用户创建的 10 个最新视频(创建日期时间存储在由水线自动添加的 createdAt
属性中)。
从这个给定的用户开始(让我们称他为 queryingUser
)我试图获取他关注的所有用户并将它们用作搜索视频的输入。我想像这样的调用:
Follower.find({where: {follower: queryingUser} , select: ['user']}).exec(function (err, users){
var userArray = [];
for (var i=0; i< users.length; i++) userArray.push(users[i].user);
Video.find({ where: {creator: userArray}, limit: 10, sort: 'createdAt DESC' }).exec(function (err, videos){
// videos should contain the desired result
});
});
我认为根据 waterline docs 这样的调用应该有效,但是,它似乎没有检索到任何结果。
我做错了什么吗?是否有不同的方法可以有效地达到预期的结果?
没关系,它确实有效。我在我的代码的其他地方犯了一个错误,但在我修复它之后我让这个例子开始工作。也许它对其他人仍然有帮助。
我正在尝试找到一种有效的方法来检索分布在多个模型中的结果。在我的示例中,我有三个模型:
Video
存储视频数据,包括视频的创建者User
存储用户数据Follower
存储哪些用户关注哪些其他用户
我的模型的简化版本如下所示:
// Video.js
module.exports = {
attributes: {
title: {
type: 'string'
},
creator: {
model: 'User'
}
}
};
// User.js
module.exports = {
attributes: {
user_name: {
type: 'string'
}
}
};
// Follower.js
module.exports = {
attributes: {
user: {
model: 'User'
},
follower: {
model: 'User'
}
}
};
我意识到我可以将多对多关联作为 Collection
直接存储在 User
中,但我也将其他值与其一起存储,例如用户何时开始关注另一个用户他从哪个目的地这样做的。此外,我存储了很多类似的数据,我想保持 Video
和 User
等核心模型精简。
所以现在我正在尝试获取由给定用户关注的用户创建的 10 个最新视频(创建日期时间存储在由水线自动添加的 createdAt
属性中)。
从这个给定的用户开始(让我们称他为 queryingUser
)我试图获取他关注的所有用户并将它们用作搜索视频的输入。我想像这样的调用:
Follower.find({where: {follower: queryingUser} , select: ['user']}).exec(function (err, users){
var userArray = [];
for (var i=0; i< users.length; i++) userArray.push(users[i].user);
Video.find({ where: {creator: userArray}, limit: 10, sort: 'createdAt DESC' }).exec(function (err, videos){
// videos should contain the desired result
});
});
我认为根据 waterline docs 这样的调用应该有效,但是,它似乎没有检索到任何结果。
我做错了什么吗?是否有不同的方法可以有效地达到预期的结果?
没关系,它确实有效。我在我的代码的其他地方犯了一个错误,但在我修复它之后我让这个例子开始工作。也许它对其他人仍然有帮助。