Найти идентификатор объекта в массиве идентификаторов объектов возвращает пустой массив с помощью 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)
})
Другие вопросы по тегам