我有两个Mongoose模式:
var EmployeeSchema = new Schema({
name: String,
servicesProvided: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Service'
}]
});
var ServiceSchema = new Schema({
name: String
});
我正在尝试查找使用我发送到http请求的服务ID提供指定服务的员工。这是我的代码:
Employee
.find({
servicesProvided: req.params.service_id
})
.exec(function(err, employees) {
if (err) {
console.log(err);
res.send(err);
} else {
res.json(employees);
}
});
问题是这段代码返回一个空数组,我不知道为什么。我尝试过很多东西,例如将服务id转换为mongoose.Schema.Types.ObjectId,但它不起作用。
有什么想法吗?我正在使用Mongoose 3.8.39。谢谢!
答案 0 :(得分:2)
在您的EmployeeSchema
中,servicesProvided
是一个数组,要按该字段过滤员工,您应该使用$in
运算符:
var services = [req.params.service_id];
Employee.find({
servicesProvided: {
$in: services
}
}, ...
答案 1 :(得分:2)
我认为你需要$elemMatch!来自docs:
{ _id: 1, results: [ { product: "abc", score: 10 }, { product: "xyz", score: 5 } ] },
{ _id: 2, results: [ { product: "abc", score: 8 }, { product: "xyz", score: 7 } ] },
{ _id: 3, results: [ { product: "abc", score: 7 }, { product: "xyz", score: 8 } ] }
搜索如下:
db.survey.find({ results: { $elemMatch: { product: "xyz", score: { $gte: 8 } } } })
结果:
{ "_id" : 3, "results" : [ { "product" : "abc", "score" : 7 }, { "product" : "xyz", "score" : 8 } ] }
但是,因为您正在执行单个查询条件(再次查看文档),您可以替换
db.survey.find(
{ results: { $elemMatch: { product: "xyz" } } }
)
与
db.survey.find(
{ "results.product": "xyz" }
)
所以在你的情况下它应该是这样的:
find({
'servicesProvided': ObjectId(req.params.service_id)
})