【问题标题】:Mongoose random and mix response from populated model来自填充模型的猫鼬随机和混合响应
【发布时间】:2017-06-27 06:41:01
【问题描述】:

在我使用 Node js 和 Mongoose 为我的 MongoDB 构建的大型社交网络方面需要一些帮助。

我的想法是混合来自模型的响应,显示用户正在关注的类别中的一个帖子,然后显示用户也在关注的另一个类别中的帖子,然后显示来自群组的帖子(私人类别 em>)。类似 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。

【问题讨论】:

  • 请澄清一下,您的问题是什么?
  • @DianaHolland 用于多个关系持有者的高级随机函数是他正在寻找的东西,如果我理解得很好
  • @MladenJanjetovic 为什么在第一次编辑时从 OP 中删除了一些代码?该代码可能与其他人有关...
  • @ThomasBormans 不,不会。只是网上找的Math random function的随机c/p,有误导性
  • 我认为这里的问题实际上是“如何从我关注的群组、关注的类别和关注的用户中获取所有帖子?”

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


【解决方案1】:

如果我完全理解你的问题,这有点不清楚,你正在寻找聚合和$sample 运算符。它随机选择文档表单集合。

【讨论】:

  • 你能给我举个例子,你将如何使用 $sample,因为我不知道......就像@MladenJanjetovic 说的那样:我认为这里的问题实际上是“我怎样才能得到所有我关注的群组、关注的类别和关注的用户中的帖子?”
【解决方案2】:

你可以做的是创建一个随机函数

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。

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 2021-05-16
    • 2018-06-04
    • 2020-11-02
    • 1970-01-01
    • 2021-09-19
    • 2019-08-29
    • 2021-12-25
    相关资源
    最近更新 更多