来自填充模型的Mongoose随机和混合响应

时间:2017-02-09 10:03:32

标签: node.js mongodb mongoose mongoose-schema mongoose-populate

需要帮助我使用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
});

请记住以下事项:

  1. 一定要快(期待数百万帖子

  2. 它使用limit(10)skip(int)进行API延迟加载

  3. 类别和群组是随机的,但帖子是有序的{created_at: desc}

  4. 用户可以关注多个categories,可以使用多个groups

2 个答案:

答案 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