Найти идентификатор объекта в массиве идентификаторов объектов возвращает пустой массив с помощью Mongoose
У меня есть две схемы Mongoose:
var EmployeeSchema = new Schema({
name: String,
servicesProvided: [{
type: mongoose.Schema.Types.ObjectId,
ref: 'Service'
}]
});
var ServiceSchema = new Schema({
name: String
});
Я пытаюсь найти сотрудников, которые предоставляют указанную услугу с идентификатором услуги, который я отправляю в запрос http. Это мой код:
Employee
.find({
servicesProvided: req.params.service_id
})
.exec(function(err, employees) {
if (err) {
console.log(err);
res.send(err);
} else {
res.json(employees);
}
});
Проблема в том, что этот код возвращает пустой массив, и я не знаю почему. Я пробовал много вещей, таких как приведение идентификатора сервиса к mongoose.Schema.Types.ObjectId, но это не работает.
Любая идея? Я использую Mongoose 3.8.39. Спасибо!
2 ответа
В вашем 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)
})