2016-04-07 35 views
2

我有两个猫鼬架构空数组:查找对象ID对象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,但它不起作用。

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

回答

2

在你EmployeeSchemaservicesProvided是一个数组,通过该字段筛选员工,你应该使用$in操作:

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

此搜索文件**内提供的数组**这是坏的开销。 –

+0

@AndreyPopov使用索引或小列表它可以相当高效。 – alexmac

+0

我同意,但仍然不需要。今天这是一个小列表,明天它是一个巨大的瓶颈:)如果你可以从一开始就让它更容易 - 为什么不呢? –

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) 
}) 
+0

对不起,它不工作或者答案。你的第一个返回一个空数组,第二个返回一个引用错误:ObjectId没有定义。如果我使用mongoose.Schema.Types.Object(req.params.service_id)也不起作用。 – gonver

+0

我不知道我的'第一'和'第二'是什么,为什么它不起作用,因为这应该是正确的方式(甚至在本地进行测试)。不知道你的地方发生了什么事。如果它适合您的需求,您可以接受其他答案,但要记住要测试它发生了什么以及为什么这不起作用。再次,检查在线手册只是为了确保;) –

+0

http://stackoverflow.com/questions/12451358/mongoose-mongo-find-in-array-of-objectids –