Случайный и смешанный ответ мангуста от заполненной модели

Нужна помощь с большой социальной сетью, которую я создаю с помощью Node js и Mongoose для моей MongoDB.

Моя идея состоит в том, чтобы смешать ответ от модели, чтобы показать одно сообщение из категории, на которую подписан пользователь, затем показать сообщение из другой категории, за которой также подписан пользователь, а затем показать сообщение из группы (частная категория) . Точно так же пост 3 + 1 (3 категории + 1 группа), но пользователь может следить за многими категориями и иметь много групп.

Есть ли что-то, что я могу использовать для получения сообщений из СЛУЧАЙНЫХ категорий + групп? Я пытаюсь здесь не изобретать колесо, записывая случайную логику с 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.


person maki10    schedule 09.02.2017    source источник
comment
поясните пожалуйста, в чем ваш вопрос?   -  person the holla    schedule 09.02.2017
comment
@DianaHolland Расширенная случайная функция для нескольких держателей отношений - это то, что он ищет, если, я хорошо понял   -  person Mladen Janjetovic    schedule 09.02.2017
comment
@MladenJanjetovic Почему вы удалили код из OP при первом редактировании? Код мог быть актуален для других людей ...   -  person Thomas Bormans    schedule 09.02.2017
comment
@ThomasBormans Нет, не пойдет. Это всего лишь случайный c / p случайной математической функции, найденной в Интернете, и вводит в заблуждение.   -  person Mladen Janjetovic    schedule 09.02.2017
comment
Я думаю, что вопрос здесь в том, как я могу получить все сообщения из групп, на которых я подписан, подписок по категориям и подписанных пользователей?   -  person Mladen Janjetovic    schedule 10.02.2017


Ответы (2)


Если я полностью понял ваш вопрос, который немного неясен, вы ищете агрегирование и оператор $ sample. Он случайным образом выбирает коллекцию форм документов.

person Dušan Minić    schedule 10.02.2017
comment
Можете ли вы привести мне пример, как вы это сделаете с помощью $ sample, потому что я понятия не имею ... Как @MladenJanjetovic говорит: я думаю, что вопрос здесь на самом деле: как мне получить все сообщения из групп, за которыми я следую, подписок по категориям, а подписались на пользователей? - person maki10; 10.02.2017

Что вы можете сделать, так это создать случайную функцию

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.

person Sibongumusa    schedule 16.12.2020