在object ids数组中查找对象id使用Mongoose返回空数组

时间:2016-04-07 16:11:44

标签: node.js mongodb mongoose schema tingodb

我有两个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);
    }
});

问题是这段代码返回一个空数组,我不知道为什么。我尝试过很多东西,例如将服务id转换为mongoose.Schema.Types.ObjectId,但它不起作用。

有什么想法吗?我正在使用Mongoose 3.8.39。谢谢!

2 个答案:

答案 0 :(得分:2)

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

var services = [req.params.service_id];
Employee.find({
  servicesProvided: {
    $in: services
  }
}, ...

答案 1 :(得分:2)

我认为你需要$elemMatch!来自docs:

{ _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)
})