需要帮助我使用Node js和Mongoose为我的MongoDB构建的大型社交网络。
我的想法是混合模型的响应,显示用户关注的类别中的一个帖子,然后显示用户也关注的另一个类别的帖子,然后显示组中的一个(私有类别)。同样3 + 1(3类+ 1组)发布,但用户可以关注多个类别,并且有很多组。
我可以使用一些东西从RANDOM类别+群组中获取帖子吗?
我在这里尝试不通过用Math
所以这是我的简化架构:
var userSchema = new Schema({
groups: [{type: Schema.Types.ObjectId, ref: 'Group'}],
followingCategories: [{type: Schema.Types.ObjectId, ref: 'Category'}]
});
var postSchema = new Schema({
user: {type: Schema.Types.ObjectId, ref: 'User'},
category: {type: Schema.Types.ObjectId, ref: 'Category'}
});
var categorySchema = new Schema({
user: {type: Schema.Types.ObjectId, ref: 'User'},
group: {type: Schema.Types.ObjectId, ref: 'Group'},
posts: [{type: Schema.Types.ObjectId, ref: 'Post'}]
});
var groupSchema = new Schema({
users: [{type: Schema.Types.ObjectId, ref: 'User'}],
categories: [{type: Schema.Types.ObjectId, ref: 'category'}]
});
它必须可以通过用户模型使用,如:
User.findById(..., function(err, user){
//logic that gets user posts from random categories and groups
});
请记住以下事项:
一定要快(期待数百万帖子 )
它使用limit(10)
和skip(int)
进行API延迟加载
类别和群组是随机的,但帖子是有序的{created_at: desc}
用户可以关注多个categories
,可以使用多个groups
。
答案 0 :(得分:0)
如果我完全理解您的问题,这有点不清楚,那么您正在寻找聚合和$sample运算符。它随机选择文件形式集合。
答案 1 :(得分:0)
您可以做的是创建一个随机函数
QuoteSchema.statics.random = function(callback) {
this.count(function(err, count) {
if (err) {
return callback(err);
}
var rand = Math.floor(Math.random() * count);
this.findOne()
.skip(rand)
.exec(callback);
}
.bind(this));
};
使用findbyId
代替使用findOne
。