以下是两种猫鼬模式:
EmployeeSchema:
var EmployeeSchema = new Schema({
name : String,
employeeDetailsId: {
type: Schema.Types.ObjectId,
ref: 'employeedetails'
}
});
EmployeeDetailSchema:
var EmployeeDetailSchema = new Schema({
employeeId: {
type: Schema.Types.ObjectId,
ref: 'employee'
},
statusId: {
type: Schema.Types.ObjectId,
ref: 'status'
}
});
EmployeeDetailSchema数据按需保存,例如将特定状态分配给Employee时。在这种情况下,一旦保存了EmployeeDetail文档,则将相应的EmployeeDetailID保存为EmployeeSchemas作为employeeDetailsId
现在,EmployeeSchema和EmployeeDetailSchema之间存在双向关系。
用例:
我想获取所有标记有特定状态的员工。说输入状态ID,1234
然后我要获取其状态ID1234
在EmployeeDetail文档中的所有雇员。
以下是我尝试使用Mongoose的方法:
exports.getEmployeesByStatus = function (req, res) {
console.log('Status ID : ' + req.query.statusId);
EmployeeModel.find({'employeeDetailsId.statusId': {$eq: mongoose.Types.ObjectId(req.params.statusId)}})
.exec(function (err, result) {
if (err)res.send('400', {message: 'Unable to fetch employees data by status. Please try again later'});
res.jsonp(result);
});
};
尽管有些员工被分配了某些状态,但返回的结果是空数组。我对Mongoose的查询方法正确吗?
您正在根据架构设计使用EmployeeDetailSchema
for的引用employeeDetailsId
。因此您无法在没有填充的情况下直接比较参考模型字段。您应该先填充,然后比较和过滤文档,否则用户aggregate
功能可以实现您的目标。
可以试试这个:
EmployeeModel.aggregate([
{$lookup: {from: 'employeedetails', localField: 'employeeDetailsId',foreignField: '_id',as: 'details'}},
{$match: { $and:[{ "details.statusId": { "$exists": true } },{"details.statusId": req.params.statusId}]} }
]).exec(function (err, result) {
if (err) return res.send('400', {message: 'Unable to fetch employees data by status. Please try again later'});
return res.jsonp(result);
});
注意:将String转换为ObjectId的值req.params.statusId
{$match: {$and: [{"details.statusId": {"$exists": true}}, {"details.statusId": mongoose.Types.ObjectId(req.params.statusId)}]}}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句