Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 在对象id数组中查找对象id使用Mongoose返回空数组_Node.js_Mongodb_Mongoose_Schema_Tingodb - Fatal编程技术网

Node.js 在对象id数组中查找对象id使用Mongoose返回空数组

Node.js 在对象id数组中查找对象id使用Mongoose返回空数组,node.js,mongodb,mongoose,schema,tingodb,Node.js,Mongodb,Mongoose,Schema,Tingodb,我有两个猫鼬模式: var EmployeeSchema = new Schema({ name: String, servicesProvided: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Service' }] }); var ServiceSchema = new Schema({ name: String }); 我试图找到提供指定服务的员工,他们的服务ID是我发送到

我有两个猫鼬模式:

var EmployeeSchema = new Schema({
    name: String,
    servicesProvided: [{
        type: mongoose.Schema.Types.ObjectId,
        ref: 'Service'
    }]
});

var ServiceSchema = new Schema({
    name: String
});
我试图找到提供指定服务的员工,他们的服务ID是我发送到http请求中的。这是我的代码:

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。谢谢

在您的
员工模式中,提供的
服务是一个数组,要按该字段筛选员工,您应使用
$In
运算符:

var services = [req.params.service_id];
Employee.find({
  servicesProvided: {
    $in: services
  }
}, ...
我想你需要!从文档:

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

因此,在您的情况下,应该是这样的:

find({
    'servicesProvided': ObjectId(req.params.service_id)
})

这会在提供的数组中搜索文档,开销很小。@AndreyPopov使用索引或小列表可以相当有效。我同意,但仍然不需要。今天是一个小列表,明天是一个巨大的瓶颈:)如果你能从一开始就让它变得更容易-为什么不呢?谢谢你的回答,它工作正常,但如果更有效,我会选择另一个答案。Np,我同意@Andreypov建议的解决方案在那个具体场景中更可取。对不起,这两个答案都不起作用。第一个返回空数组,第二个返回引用错误:ObjectId未定义。如果我使用mongoose.Schema.Types.Object(req.params.service_id)也不起作用。我不知道我的“第一个”和“第二个”是什么,以及为什么不起作用,因为这应该是正确的方法(甚至在本地测试)。不知道你家发生了什么事。如果另一个答案适合你的需要,你可以接受它,但是记住要测试它到底发生了什么以及为什么不起作用。再次检查在线手册以确保;)第一个答案是:
'servicesProvided':req.params.service\u id
,第二个答案是:
'servicesProvided.id':ObjectId(req.params.service\u id)
。我相信这是正确的方法,但由于某种原因,它不起作用。我在很多网络论坛上都读到过这个问题,可能是猫鼬版本的一个bug。
find({
    'servicesProvided': ObjectId(req.params.service_id)
})