2

我有两个猫鼬模式:

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 但它不起作用。

任何想法?我正在使用猫鼬 3.8.39。谢谢!

4

2 回答 2

3

在您的EmployeeSchema,servicesProvided是一个数组,要按该字段过滤员工,您应该使用$in运算符:

var services = [req.params.service_id];
Employee.find({
  servicesProvided: {
    $in: services
  }
}, ...
于 2016-04-07T16:36:44.103 回答
2

我认为您需要$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)
})
于 2016-04-07T16:47:13.487 回答