使用 Mongoose 在对象 ID 数组 returns 空数组中查找对象 ID
Find object id in object ids array returns empty array using Mongoose
我有两个 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);
}
});
问题是这段代码 returns 是一个空数组,我不知道为什么。我尝试了很多方法,例如将服务 ID 转换为 mongoose.Schema.Types.ObjectId,但它不起作用。
有什么想法吗?我正在使用猫鼬 3.8.39。谢谢!
在您的 EmployeeSchema
中,servicesProvided
是一个数组,要按该字段过滤员工,您应该使用 $in
运算符:
var services = [req.params.service_id];
Employee.find({
servicesProvided: {
$in: services
}
}, ...
我觉得你需要$elemMatch!来自文档:
{ _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)
})
我有两个 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);
}
});
问题是这段代码 returns 是一个空数组,我不知道为什么。我尝试了很多方法,例如将服务 ID 转换为 mongoose.Schema.Types.ObjectId,但它不起作用。
有什么想法吗?我正在使用猫鼬 3.8.39。谢谢!
在您的 EmployeeSchema
中,servicesProvided
是一个数组,要按该字段过滤员工,您应该使用 $in
运算符:
var services = [req.params.service_id];
Employee.find({
servicesProvided: {
$in: services
}
}, ...
我觉得你需要$elemMatch!来自文档:
{ _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)
})