如何使用node.js中的population搜索两个表中的数据?

时间:2016-06-03 12:08:50

标签: node.js mongoose-populate

我有用户报表请求表格的下方架构,并使用填充来获取和显示报告用户列表。

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 个答案:

答案 0 :(得分:1)

使用填充,您可以对填充的文档发出“子查询”:

Index.php 
include('layout/meta.php');

if(isset($_GET['page']) && $_GET['page'] == 'welcome') {
        $data['page'] = 'welcome';
        include('layout/welcome.php',$data);
}

但是,据我所知,这将首先从数据库中检索所有 report_request.find() .populate({ path : 'user_id', match : { name : /Ruby/i } }) .exec(...) 文档,然后针对repost_request运行查询以找到匹配的文档{ {1}}。

因此,就性能而言,这不是一个好的解决方案。但是,使用模式,我认为只有 解决方案只需一步即可执行。

相反,您首先需要找到与该名称匹配的用户,并使用他们的ID来查找属于他们的报告:

user

(我不记得/Ruby/i在Mongoose中是否也能正常工作;如果是这样,它可以为您节省额外的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) { ... }); });