2016-06-03 4 views
1

У меня есть схема для Пользователь и Отправка запроса таблицы и использование популяции для извлечения и отображения списка зарегистрированных пользователей.Как искать данные из двух таблиц с использованием совокупности в 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 } } будет работать, а в Мангуста , если это так, это сэкономит вам дополнительные users.map())