Я пытаюсь найти эффективный способ получить результаты, которые распространяются на несколько моделей. В моем примере у меня есть три модели:Эффективные запросы по нескольким моделям с использованием Sailing.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
lean.
Итак, теперь я пытаюсь получить 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 вызов, как это должно работать, однако, как представляется, не получить никаких результатов.
Я что-то не так? Существует ли другой подход, который привел бы к желаемому результату эффективным образом?