Node.js 在对象id数组中查找对象id使用Mongoose返回空数组
我有两个猫鼬模式:Node.js 在对象id数组中查找对象id使用Mongoose返回空数组,node.js,mongodb,mongoose,schema,tingodb,Node.js,Mongodb,Mongoose,Schema,Tingodb,我有两个猫鼬模式: var EmployeeSchema = new Schema({ name: String, servicesProvided: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Service' }] }); var ServiceSchema = new Schema({ name: String }); 我试图找到提供指定服务的员工,他们的服务ID是我发送到
var EmployeeSchema = new Schema({
name: String,
servicesProvided: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Service'
}]
});
var ServiceSchema = new Schema({
name: String
});
我试图找到提供指定服务的员工,他们的服务ID是我发送到http请求中的。这是我的代码:
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,但都不起作用
有什么想法吗?我用的是猫鼬3.8.39。谢谢 在您的
员工模式中,提供的服务是一个数组,要按该字段筛选员工,您应使用$In
运算符:
var services = [req.params.service_id];
Employee.find({
servicesProvided: {
$in: services
}
}, ...
我想你需要!从文档:
{ _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" } } }
)
与
因此,在您的情况下,应该是这样的:
find({
'servicesProvided': ObjectId(req.params.service_id)
})
这会在提供的数组中搜索文档,开销很小。@AndreyPopov使用索引或小列表可以相当有效。我同意,但仍然不需要。今天是一个小列表,明天是一个巨大的瓶颈:)如果你能从一开始就让它变得更容易-为什么不呢?谢谢你的回答,它工作正常,但如果更有效,我会选择另一个答案。Np,我同意@Andreypov建议的解决方案在那个具体场景中更可取。对不起,这两个答案都不起作用。第一个返回空数组,第二个返回引用错误:ObjectId未定义。如果我使用mongoose.Schema.Types.Object(req.params.service_id)也不起作用。我不知道我的“第一个”和“第二个”是什么,以及为什么不起作用,因为这应该是正确的方法(甚至在本地测试)。不知道你家发生了什么事。如果另一个答案适合你的需要,你可以接受它,但是记住要测试它到底发生了什么以及为什么不起作用。再次检查在线手册以确保;)第一个答案是:'servicesProvided':req.params.service\u id
,第二个答案是:'servicesProvided.id':ObjectId(req.params.service\u id)
。我相信这是正确的方法,但由于某种原因,它不起作用。我在很多网络论坛上都读到过这个问题,可能是猫鼬版本的一个bug。
find({
'servicesProvided': ObjectId(req.params.service_id)
})