Как искать данные из двух таблиц, используя население в 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()
)