我正在处理一个Waterline查询,它通过集合属性过滤对象。在此简化示例中,我有两个模型,Video
和Category
:
// Video.js
module.exports = {
attributes: {
title: {
type: 'string'
},
categories: {
collection: 'Category',
via: 'videos'
}
}
};
// Category.js
module.exports = {
attributes: {
name: {
type: 'string'
},
videos: {
collection: 'Video',
via 'categories'
}
}
};
我想查找与某个类别相关联的所有视频。我将类别ID存储在名为categoryID
的变量中,并尝试此查询:
Video.find('categories': categoryID).exec(function (err, videos) {
// videos should contain all videos associated with the categoryID
});
然而,即使有与我正在寻找的类别相关的视频,我总是得到一个空的结果。我知道水线当前不支持对集合属性中的值进行深度查询,但我认为至少对该对象的id的查询是可行的。我错了吗?
如果是这样,是否有其他方法可以在不使用本机查询的情况下实现所需的结果?
我知道我可以向Category
添加一个集合属性,并从Category
方面构建我的查询。但是,这只是一个更复杂的搜索的开始,我还使用存储在Video
对象中的其他属性(例如视频创建者的用户ID)缩小结果范围。最后,我使用分页迭代视频结果。所以我正在寻找一种方法来检索某些类别的视频,这些视频可以与存储在Video
对象中的其他搜索属性结合使用。
答案 0 :(得分:1)
视频模型:
module.exports = {
attributes: {
name: {
type: 'string'
},
categories: {
collection: 'category',
via: 'videos'
},
toJSON: function() {
var obj = this.toObject();
return obj;
}
}
};
类别模型:
module.exports = {
attributes: {
name: {
type: 'string'
},
videos: {
collection: 'Video',
via: 'categories'
}
}
};
您的查询将如下所示:
var arr = ['56667a2cbaea1fcd11c54851','56667b1053c6c37a1283ea75'];
Video.find().populate("categories",{id:arr}).exec(function(e, r) {
res.json(r);
})
答案 1 :(得分:0)
将Category.js
修改为:
module.exports = {
attributes: {
name: {
type: 'string'
},
videos: {
collection: 'Video',
via: 'categories'
}
}
};
修改Video.js
module.exports = {
attributes: {
title: {
type: 'string'
},
categories: {
collection: 'Category',
via: 'videos'
}
}
};
添加视频时
var title = req.param('title');
var categories = req.param('categories').split(','); //ids of categories in format 1,3,8 etc
Video.create({name: title, categories: categories}, function(err, succ){
if(err){
return res.serverError(err);
}else {
return res.json(200, succ);
}
});
要查找具有特定类别的所有视频,请使用水线中的populate()
帮助程序。
var categoryId = req.param('catId');
Category.find({id: categoryId}).populate('videos').exec(function(err, results){
if(err){
return res.serverError(err);
}else {
return res.json(200, results);
}
});