Как искать данные из двух таблиц, используя население в node.js?

У меня есть ниже схема для таблиц пользователей и запросов отчетов и использование населения для получения и отображения списка зарегистрированных пользователей.

var user = new Schema({
    name : {type:String,required:[true,"name is required"]},
});

var report_request = new Schema({
    user_id : {type:Schema.Types.ObjectId, ref: 'user' },
    reported_by_id : {type:Schema.Types.ObjectId, ref: 'user' },
    reason : String,
});

Но проблема в том, что у меня есть поисковые фильтры в списке и я могу искать зарегистрированных пользователей по имени. Поэтому я хочу сделать что-то вроде этого: report_request.find({'user.name': /Ruby/i});

id  Name    Reported By
1   Ruby    Mark
2   Johny   Ruby

Я пытался сделать это, но это не работает. Так есть ли другой способ сделать это?

Заранее спасибо!!

1 ответ

Решение

Используя заполнение, вы можете выполнить "подзапрос" для заполненных документов:

report_request.find()
              .populate({
                path  : 'user_id',
                match : { name : /Ruby/i }
              })
              .exec(...)

Однако, насколько я знаю, это будет сначала восстановить все repost_request документы из базы данных и впоследствии выполнить запрос к user чтобы найти те, которые соответствуют /Ruby/i,

Так что с точки зрения производительности это не очень хорошее решение. Однако, с вашей схемой, я думаю, это единственное решение, которое может быть выполнено за один шаг.

Вместо этого сначала нужно найти пользователей, которые соответствуют имени, и использовать их идентификаторы для поиска принадлежащих им отчетов:

user.find({ name : /Ruby/i }).exec(function(err, users) {
  var ids = users.map(function(user) { return user.id });
  request_report.find({ user_id : { $in : ids } }).exec(function(err, requests) {
  ...
  });
});

(Я не могу вспомнить, если { user_id : { $in : users } } будет работать так же в Mongoose; если это так, это сэкономит вам дополнительные users.map())

Другие вопросы по тегам