如何使用 node.js 中的人口从两个表中搜索数据?
How to search data from two tables using population in node.js?
我有下面的 User 和 Report Request 表的架构,并使用 population 来获取和显示报告的用户列表。
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
我试过这样做,但没有用。那么他们还有其他方法可以做到这一点吗?
提前致谢!!
使用 population,您可以针对填充的文档发出 "sub-query":
report_request.find()
.populate({
path : 'user_id',
match : { name : /Ruby/i }
})
.exec(...)
然而,据我所知,这将首先从数据库中检索 all repost_request
文档,然后 运行 查询 user
找到匹配 /Ruby/i
.
的那些
因此,就性能而言,这不是一个好的解决方案。但是,对于您所拥有的架构,我认为这是 唯一 可以通过一个步骤执行的解决方案。
相反,您首先需要找到与名称匹配的用户,然后使用他们的 ID 找到属于他们的报告:
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()
)
我有下面的 User 和 Report Request 表的架构,并使用 population 来获取和显示报告的用户列表。
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
我试过这样做,但没有用。那么他们还有其他方法可以做到这一点吗?
提前致谢!!
使用 population,您可以针对填充的文档发出 "sub-query":
report_request.find()
.populate({
path : 'user_id',
match : { name : /Ruby/i }
})
.exec(...)
然而,据我所知,这将首先从数据库中检索 all repost_request
文档,然后 运行 查询 user
找到匹配 /Ruby/i
.
因此,就性能而言,这不是一个好的解决方案。但是,对于您所拥有的架构,我认为这是 唯一 可以通过一个步骤执行的解决方案。
相反,您首先需要找到与名称匹配的用户,然后使用他们的 ID 找到属于他们的报告:
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()
)